今日主要内容:
1.迭代器和生成器补充,
2.生成器表达式和列表表达式.以及各种推导式
3.内置函数
1) 迭代器和生成器补充
1.查看一个对像是否是可迭代的,以及是否是迭代器.还可以通过导入这两个方法来实现
示例:
from collections import Iterable #导入看是否可迭代的对像 from collections import Iterator #导入查看是否是迭代器 s = "123" f = isinstance(s,Iterable) print(f) f2 = isinstance(s,Iterator) print(f2) """ 运行结果是 True False """
2.可迭代对像的特点是内部含有__iter__这个方法,迭代器特点是内部含有__iter__方法和__next__这个方法.
3.如下示例:注意生成器是如何生成的.
def fun(): for i in range(10): yield i gen= fun() # 这里的操作是生成一个生成器,注意,这里是并不执行的.只是一个生成器.
4.生成器有两种生成方法,一种是函数中带有yield,即通过生成器函数来生成.一种是通过生成器表达式来生成.
5.可迭代对像变成迭代器的方法有如下两种.
一种s.__iter__()这个就是生成了迭代器
一种是iter(对像)这个通过iter函数来实现
6迭代器的优点,主要有如下三个优点:
一.节省内存
二.惰性机制
三.单向不可逆
7.通过dir来查看一个可迭代对像是否是可迭代的,以及是否是生成器,
代码示例如下:
s ="123" print("__iter__" in dir(s)) print("__next__" in dir(s))
2).生成器表达式和列表表达式.以及各种推导式
首先看一下列表表达式,示例如下:
lst = ["校服%s" % i for i in range(10)] print(lst)
具体的格式如下:
[变量(加工后的变量) for 变量 in iterable] 循环模式
列表推导式有两种模式,一种是上面说的循环模式,一种是条件模式.
分类:
[变量(加工后的变量) for 变量 in iterable] 循环模式
[变量(加工后的变量) for 变量 in iterable if 条件] 筛选模式
下面是示例代码:
#10以内所有数的平方 lst = [i**2 for i in range(11)] print(lst) #30以内所有能被3整除的数的平方 lst1 = [i*i for i in range(1,31) if i % 3 == 0 ] print(lst1) #100 以内所有的奇数. lst2 = [i for i in range(100) if i % 2 == 1] print(lst2)
生成器就是把[]换成()列表表达式就变成了,生成器表达式.
如上面的代码换成生成器,并且表现出来,如下:
#10以内所有数的平方 gen = (i**2 for i in range(11)) #生成一个生成器 print(gen.__next__()) #30以内所有能被3整除的数的平方 # gen1 = (i*i for i in range(1,31) if i % 3 == 0 ) #生成一个生成器 print(gen1.__next__()) #100 以内所有的奇数. gen2 = (i for i in range(100) if i % 2 == 1) #生成一个生成器 print(gen2.__next__()) #v如果想全部取出来的话,可以用for for i in gen2: print(i)
为什么有生成器:
生成器本身是自己用python代码构建的,这样就满足了个性化需求,满足以后你工作中需要.
下面有一个示例题:
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
获取上面列表中的名字里面有两个e的,放在新的列表中.
示例代码:
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] lst = [name for i in names for name in i if name.count("e") ==2] print(lst)
各种推导式:
字典推导式:
#将一个字典的key和value对调 mcase = {'a': 10, 'b': 34} dic = {mcase[i]:i for i in mcase} print(dic) #例二:合并大小写对应的value值,将k统一成小写 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} dic2 = {i.lower():(mcase.get(i.upper(),0) + mcase.get(i.lower(),0)) for i in mcase} print(dic2)
集合推导式:
squared = {x**2 for x in [1, -1, 2]} print(squared) # Output: set([1, 4])
练习题:
例1: 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
例2: 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
例3: 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
3)内置函数
内置函数: 一些常用的功能,python都给你封装好了,供你直接使用.
作用域相关:
globals() 无论在哪里调用用户打印的都是全局的.
locals() 只打印当前函数的变量,不打印上层函数的变量,如果这个在主函数打印的话,和globals一个效果.
其他相关:
eval 执行字符串类型的代码,并返回最终结果。
示例:
f = eval("1+2") print(f) #执行后会返回执行结果 #这个需要注意的是 dic = eval("{'a':2,'b':3}") print(dic) print(type(dic)) """ 执行结果如下: 3 {'a': 2, 'b': 3} <class 'dict'> """
exec 执行字符串类型的代码。不返回任何值.
示例:
code = ''' for i in range(1, 11): print(i) ''' print(exec(code)) """ 执行结果如下: 1 2 3 4 5 6 7 8 9 10 None """
print()函数,这个有两点要注意,有两个参数
print(123,456,sep=",",end="") """ 执行结果: 123,456 sep 为变量之间用什么切割,end表示是否加换行 """
hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。注意每次相同内容的hash值是不一样的.
# print(hash('name'))
# print(hash(7117817419752622577))
# print(hash('name1'))
# print(hash('name2'))
# print(hash('name3'))
# print(hash(100))
# print(hash(1))
# print(hash(True))
callable 函数,查看对像是否是可调用的.
比如str是不可调用的,函数是可调用的.示例如下:
str = "133" def fun(): pass print(callable(str)) print(callable(fun)) """ 执行结果如下: False True """