迭代器、三元、列表推导式、字典生成式、生成器生成式、递归
一、迭代器
迭代器提供了不依赖索引取值的手段
1.可迭代对象
s = 'abc' s.__iter__() lt = [1, 2, 3] lt.__iter__() tup = (1,) tup.__iter__() dic = {'a': 1} dic.__iter__() se = {1} se.__iter__() fw = open('test.txt', 'a+', encoding='utf8') fw.seek(0, 0) fw.__iter__()
可迭代对象 Iterable :含有__iter__方法叫做可迭代对象--> 除了数字类型都是可迭代对象 --> 可迭代对象使用__iter__变成迭代器
迭代器对象 Iterator: 含有__iter__和__next__方法叫做迭代器对象 --> 只有文件是迭代器对象 --> 迭代器使用__iter__依然是迭代器
可迭代对象不一定是迭代器对象,迭代器对象一定是可迭代对象
for 循环原理:for循环本质就是一个while循环,只不过是一个一定可控的while循环
dic_iter = dic.__iter__() #变成迭代器
while True:
try:
print(dic_iter.__next__()) #超过迭代个数的会报错
except StopIteration:
break
模板:
def for1 (iterable):
iterator = iterable.__iter__()
while True:
try:
print(iterator.__next__())
except StopIteration:
break
for1(1,2,3)
二、三元表达式
x = 10 y = 20 if x>y: print (x) else: print (y) 三元表达式: print (x) if x>y else print(y)
三、列表推导式
It = [] for i in range(1,10): It.append(i) print(It) 列表推导式: It = [i for i in range(1,10)] print(It) 列表推导式里面的i 可以进行运算 It = [i*2 for i in range(1,10)]
四、字典生成式
zip:相当于是拉链,是迭代器类型
res = zip([1,2,3],[4,2,3,4,2,3,4,2,3],'abcadsfasdfasdf')
print(res.__next__())
print(res.__next__())
print(res.__next__())
打印结果为:(1, 4, 'a')
(2, 2, 'b')
(3, 3, 'c')
res = zip([1,2,3],[4,2,3,4,2,3,4,2,3])
dic = {k:v*2 for k,v in res}
print(dic)
打印结果为:{1: 8, 2: 4, 3: 6}
六、生成器
generator 本质是一个迭代器 ---> 生成器: 本质就是迭代器,生成器就是一个自定义的迭代器
生成器:含有yield 关键字的的函数叫做生成器
yield的特征:
1.暂停函数
2相当于通过next取值
def ge(): yield 3 #一个yield相当于一个next;同时暂停函数,不往下运行 yield 4 # print(ge()) # ge()得到一个生成器 --> 生成器本质是迭代器 g = ge() # 得到一个生成器 # print(g.__next__()) # print(g.__next__()) # print(g.__next__())
def rane(start): count = 0 while count<start: yield count count +=1 for i in range(3): print(i) 打印结果为: 0 1 2
7、递归
每一次递归,会不会结束函数?不会,并且每一次递归都会开辟内存空间,如果一直开辟内存就炸掉了,所以最多递归1000次,所以真正的递归必须要有退出条件。
递归:
1.函数a内部直接调用函数a本身
2.必须要有退出条件
3.递归必须要有规律
count = 1
def fun():
global count
count+=1
print(count)
if count==5:
return
fun()
fun()
打印结果为:
2
3
4
5
案例:玉阳 20岁 ; 后面的同学大2岁,后面的后面的同学比后面的同学大2岁; 求第6位同学的年龄
def age(x):
if x ==0:
return 20
x-=1
return age(x)+2
res = age(6)
print(res)
age = 20
def age_num(x):
global age
age +=2
x-=1
if x ==0:
print(age)
return
age_num(x)
age_num(6)
count = 0
age = 20
def age_num(x):
global age
age +=2
global count
count +=1
if count ==6:
print(age)
return
age_num(x)
age_num(6)