python函数六(生成器,内置函数)
一。生成器
生成器三种方式:
1)生成器函数
2)数据转化
def gener(): print(111) yield 222 print(333) count = yield 444 print(count) print(555) yield 666 g = gener() print(g) # print(list(g)) print(g.__next__()) print(g.__next__()) print(g.send('asd')) print(list(g)) # 输出结果: # <generator object gener at 0x0000017116671BF8> # 111 # 222 # 333 # 444 # asd # 555 # 666 # [] 此时生成器函数运行到yield 666 的位置,所以g转化成列表是空[] # 如果一开始只打印print(list(g))----->输出结果完全不同。结果如下: # 111 # 333 # None # 555 # [222, 444, 666]
3)用生成器表达式
列表推导式与生成器表达式比较:
列表推导式,生成器表达式
1)列表推导式比较直观,占内存
2)生成器表达式不容易看出内容,省内存.
[ 变量(加工后的数据) for 变量i in 可迭代的数据类型 ] 列表的推导式, 循环模式
[ 变量(加工后的数据) for 变量i in 可迭代的数据类型 if 条件] 列表的推导式, 筛选模式
列表推导式
# 打印选项1,选项2。。。直到选项10 li = ['选项%s'%i for i in range(1,11)] print(li) # 打印30以内能被4整除的所有整数 l1 = [i for i in range(31) if i % 4 == 0] print(l1) # 把{'name':'alex','age':29}里的键跟对应的值调换 dic = {'name':'alex','age':29} dict = {dic[i]:i for i in dic} print(dict) # 把里面有两个e元素的罗列出来组成列表 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] l2 = [name for i in names for name in i if name.count('e') == 2] print(l2)
生成器表达式
# 打印30以内能被4整除的所有整数 l1 = (i for i in range(31) if i % 4 == 0) print(l1) #<generator object <genexpr> at 0x0000026AFA1E1BF8> for i in l1: print(i) # # 0 # 4 # 8 # 12 # 16 # 20 # 24 # 28
二。内置函数
Python自带的函数。比如range(),input(),len(),print(),dir(),max(),int(),min(),sum(),str(),list(),tuple(),id()
1.
#print() print('666',end='') print('666') # 输出结果: 666666 print(1,2,3,4,5,sep='|') # 输出结果: 1|2|3|4|5 # 可以直接把想写的内容写入文件 f = open('file','w',encoding='utf-8') print(666,file=f) f.close()
2.
dir() 查找对象的所有方法 print(dir([]))
3.
locals() 将局部的变量储存起来 globals() 将全局的变量,函数名,等等 储存起来. def func(): name = 'alex' print(locals()) print(globals()) func()
4.
help(str) 将你查询的对象所有信息都拿出来.
5.
# abs()取绝对值 print(abs(-1)) # 结果: 1 def func(ret): print(44) # 最大值 ret = max(1,2,-3,key=abs) print(ret) #-3 # #最小值 ret = min([1,2,3]) print(ret) #1 # #sum iterable,初始值 ret = sum([1,2,3],10) print(ret) #16
6.
#callable 判断此变量是不是函数名 name = 'alex' print(callable(name)) #False def func(): print(666) print(callable(func)) #True
7.
#hash() 通过哈希表的规则,将对象转换成哈希值 print(hash('fdsakfhdsafsda')) print(hash('fd')) print(hash('fsdsafsda')) print(hash('fdsdsafsda')) print(hash('dsakhdsafsda')) print(hash(('a','b'))) print(hash(True)) # 输出结果: # 1415579162147690152 # 5615420092049468879 # 4610262276372645226 # -5880321922146481963 # -9092531373745077475 # 1754971611771896552 # 1
8.
#all 可迭代对象里面的所有的值转化成bool值如果都是True则,返回True print(all([1,2,3,0])) #False
9.
#十进制转化成二进制 print(bin(100)) #0b1100100 # #将十进制转化成八进制 print(oct(9)) #0o11 # #将十进制转化成十六进制 print(hex(33)) #0x21
10.
#数据类型str() #float :有限小数,无线循环小数,不包含(无线不循环小数) print(1.35432,type(1.35432)) #1.35432 <class 'float'> print(float(3)) #3.0
11.
complex() ''' 实数: 有理数,无理数. 虚数:j2 复数: 1 + 2j '''
12.
#divmod() 分页 print(divmod(7,2)) #(3,1)(商,余数)
13.重要的
#enumerate(iterable,start 起始值) 枚举 l = ['手机','电话','耳机',] for i in enumerate(l): print(i) # 输出结果: # (0, '手机') # (1, '电话') # (2, '耳机') l = ['手机','电话','耳机',] for i,j in enumerate(l,100): print(i,j) # 输出结果: # 100 手机 # 101 电话 # 102 耳机
14.
#eval 有返回值 除去字符串两边的引号,返回里面的内容 #exec 没有返回值 除去字符串两边的引号,执行里面的代码 #流程语句 s = "{'name':'alex'}" s1 = "1+2+3+4" print(eval(s),type(eval(s))) #{'name': 'alex'} <class 'dict'> print(exec(s),type(exec(s))) #None <class 'NoneType'> print(eval(s1)) #10 code = '''for i in range(10): print(i)''' print(exec(code)) # 0 1 2 3 4 5 6 7 8 9 None