PYTHON第十七天笔记9.8

memoryview每次切片不占用内存空间,只是展示,但是需要bytes类型
sort和sorted,一摸一样,只不过生成新
1、内置函数继续:
(1)divmod //取商、余
# ret = divmod(7,3)
# print(ret)
# (1,4) #(商,余)
(2)round //取几位小数点
print(round(2.32342342,3)) //round(取几位小数,若取到的小数的后一位大于5,则最后一位小数四舍五入)
(3)pow //幂运算,几次方
print(pow(2,3)) //幂运算
print(pow(2,3,5)) //幂运算取余数,pow(2**3%5)
(4)abs //取绝对值
print(abs(-9)) #9
(5)sum //求和
print(sum([1,2,3,4,5],'本钱')) //sum(可迭代对象,起始值:设起始值的结果是(起始值+可迭代对象里面各个元素的值)的和)
(6)min //取最小值
print(min([],key=abs,default=9)) //min(iterable,key=func,default=默认值)
(7)max //取最大值
print(max([1,2,3,-4],key=abs)) //取[1,2,3,-4]里面绝对值的最大值
dic={'k1':10,'k2':100,'k3':30}
def func(n):
print(n)
return dic[n]
ret = max(dic,key = func) //循环字典中的k值传给func参数
print(ret)
#min、max:
# 可以接收散列的值,和可迭代的对象
# key是一个函数名,判断的结果根据函数的返回值来确定
# defult 如果可迭代对象为空,可设置默认值返回
#sum与min、max:
# sum和min、max函数不一样,sum是加可迭代对象,min、max是加可迭代对象和迭代器都可以。
(8)reversed //反转序列,得到的是生成器
# ret = reversed([1,2,3,4])
# ret = reversed(range(0,20))
# ret = reversed('ajagjfd')
# print(''.join(list(ret)))
(9)slice // 切片,注意⚠️:用切片取出来的列表为新列表
l = [1,2,3,4,5]
print(l[1:5:2]) # 语法糖
等于
l = [1,2,3,4,5]
my = slice(1,5,2)
print(l[my]) # l[1:5:2]
(10)format
print(format('test', '<20')) //一共20个字符位,test在最左边
print(format('test', '>20')) //一共20个字符位,test在最右边
print(format('test', '^20')) //一共20个字符位,test在中间
(11)bytes //转换成字节类型
# s = 'alex'
# by = bytes(s,encoding='utf-8') #新华字典第n页第m行第k个
# print(by)
# print(by.decode('utf-8'))
 
# array <==> 数组
# s = 'alex'
# ret = bytearray(s,encoding='utf-8')
# print(id(ret))
# ret[0] = 65
# print(ret,id(ret))
# s = ret.decode('utf-8')
(12)memoryview
ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret))
print(bytes(ret[:3]).decode('utf-8'))
print(bytes(ret[3:]).decode('utf-8'))
(13)ascii编码转换
# print(ord('A')) //字符转成ascii编码,65
# print(chr(97)) //ascii编码转成字符,a
# print(ascii('你好'))
(14)repr
# print(123)
# print('123')
# print(repr(123)) //等于print(123)
# print(repr('123')) //保留字符串的引号,'123'
# inp =input('>>>') #输入123为字符串类型
# print(repr(inp)) //保留字符串的引号,'123'
 
# print('你好 :%s'%('alex')) //输出字符串
# print('你好 :%r'%('alex')) //输出字符串并保留引号
(15)frozenset //将集合彻底变成不可变
test = set('hello')
tt = test.add('aaa')
print(test,tt)
f_test = frozenset(test)
print(f_test)
# dic = {f_test:1} //可做字典key值
# print(dic)
(16)all和any
# print(all([1,22,'',4])) // all: 函数里加可迭代对象,所有元素都为True则为True
# print(any([1,'',(),None])) // any: 函数里加可迭代对象,有任何一个为True则为True
(17)zip
#按顺序将可迭代对象对应的值组合到一个元组内,且只按最短序列个数算,zip函数最终得到一个生成器。
l = (12,3,4,5,6,7)
l2 = ('a','b','c','d')
l3 = [9,8,7]
ret = zip(l,l2,l3)
print(ret)
for i in ret:
print(i)
(18)sorted // 将数值从小到大排序,返回的是原序列的副本(不同的),而使用sort返回的则是原序列(相同的)。
l = [1,34,3,-5864,5,-1236,7,4.567]
# l2 = sorted(l) // l2 与 原l为两个单独独立的列表
print(sorted(l))
print(sorted(l,key=abs)) //key后可指定对应用于计算的函数,取前面可迭代对象的元素做为值。
l = [[1,2],[3,4,5,6],(7,),'123']
print(sorted(l,key=len))
2、匿名函数
匿名函数:(lambda表达式、lambda函数)
为了解决那些功能很简单的需求而设计的一句话函数。
函数格式:函数名 = lambda 参数 : 返回值
calc = lambda n : n*n
(# 参数可以有多个,用逗号隔开;
# 匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
# 同正常函数,返回值可以是任意数据类型
# 匿名函数可以有函数名,也可以匿名res = map(lambda x:x**2,[1,5,7,4,8]))
#一句话的python:
#三元运算
#各种推导式、生成器表达式
#lambda表达式
# def calc(n,m):
# return n**n
# print(calc(10,1))
 
# calc2 = lambda n,m : n**m
# my_max = lambda n,m : n if n>m else m
# print(calc2(10,2))
# print(my_max(10,2))
# add = lambda x,y : x+y
# print(add(1,5))
 
# dic={'k1':10,'k2':100,'k3':30}
# print(max(dic)) //比较的是key,返回的是key。
# print(max(dic,key=lambda k:dic[k])) //比较的是value值,返回的是key。
 
(19)map // 类似于filter(),接收一个函数和可迭代对象,返回的是生成器;但是通常搭配lambda用于执行函数内容或计算,而不是通过条件筛选结果。
# def func(n):return n**2
# for i in map(func,[1,5,7,4,6]):
# print(i)
等同:
# for i in map(lambda n:n**2,[1,5,7,4,6]):
# print(i)
(20)filter // 接收一个函数和可迭代对象,函数的作用是对每个元素进行判断True或False,根据判断结果过滤掉不符合条件的元素,将剩余符合条件的元素组成新可迭代对象,返回,生成器。
# def func(n):
# if n > 10:
# return True
# print(filter(func,[12,324,555,3,1]))
# for i in filter(func,[12,213,341,2,1,2]):
# print(i)
等同简化为:
# for i in filter(lambda n: n>10 ,[12,213,341,2,1,2]):
# print(i)
练习:
请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]。
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
print filter(is_sqr, range(1, 101))
面试题:
(1).现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]。
t1 = (('a'),('b'))
t2 = (('c'),('d'))
for i in zip(t1,t2):
print(i)
print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
列表推导式解决:
print([{i[0]:i[1]} for i in zip(t1,t2)])
lambda+列表推导式解决:
# test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
# print(test(t1,t2))
(2).下面程序的输出结果是:
# d = lambda p:p*2
# t = lambda p:p*3
# x = 2
# x = d(x) # x = 4
# x = t(x) # x = 12
# x = d(x) # x = 24
# print(x) //24
(3).以下代码的输出是什么?请给出答案并解释。(进阶)
'''
def multipliers():
return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
请修改multipliers的定义来产生期望的结果。
'''
分析:
def multipliers():
# new_l = []
# for i in range(4):
# def func(x):
# return x*i
# new_l.append(func)
# return new_l
return [lambda x: i * x for i in range(4)] #6,6,6,6
# i = 0
# [func]
# i = 1
# [func,func]
# i = 2
# [func,func,func]
# i = 3
# [func,func,func,func]
 
# for func in multipliers():
# func(2)
print([m(2) for m in multipliers()])
 
# def func():
# print(2*i)
# l=[]
# i = 0
# l.append(func)
# i = 1
# l.append(func)
# i = 2
# l.append(func)
# for func in l:
# func()
 
posted @ 2017-09-10 23:27  主啊~  阅读(109)  评论(0编辑  收藏  举报