迭代器
只要拥有__iter__方法的都是可迭代对象
迭代器对象:拥有 iter 和__next__方法的就是迭代器对象
字符串/列表/元组/字典/集合/文件都是可迭代对象
__next__遍历可迭代对象中的元素
文件本身就是迭代器对象
迭代器对象使用__iter__方法后还是迭代器本身
# 以下都是可迭代对象
name = 'nick'.__iter__
lis = [1,2].__iter__
tup = (1,2).__iter__
dic = {'name':'nick'}.__iter__
s1 = {'a','b'}.__iter__
f = open('text.txt','w',encoding='utf-8')
f.__iter__
f.close
s = 'hello'
iter_s = s.__iter__()
while True:
try:
print(iter_s.__next__())
except StopIteration:
break
h
e
l
l
o
三元表达式和列表推导式
三元表达式
name='xiaogou'
if name=='fenggou':
print('远离他')
else:
print('盘他')
三元表达式表示:
print('远离他') if name=='fenggou' else print('盘他')
列表推导式
lis=[]
for i in range(100):
lis.append(i)
print(lis)
列表推导式表示:
[print(i) for i in lis if i>50]
字典生成式
字典生成式
print({i: i**2 for i in range(10)})
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
zip()方法
keys = ['name','age','gender']
values = ['nick',19,'male']
res = zip(keys,values)
info_dict = {k: v for k,v in res}
print(info_dict)
{'name':'nick','age':19,'sex':'male'}
生成器
yield关键字
def func():
print(1)
yield
print(2)
yield
g = func()
for i in g:
print(i)
1
None
2
None
yield和return
相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
不同点:return只能返回一次值,yield可以返回多次值
生成器表达式
- 把列表推导式的[]换成()就是生成器表达式
- 优点:省内存,一次只产生一个值在内存中
tup = (i for i in range(10))
print(tup)
递归
函数自己调用函数自己,类似于循环,但是必须得有结束条件
直接调用
直接在函数内部调用函数自身
def f1(x):
print(x)
x += 1
if x == 10:
return
f1(x)
f1(0)
间接调用
不在原函数体内调用函数自身,而是通过其他的方法间接调用函数自身
def bar():
print('from bar')
foo()
def foo():
print('from foo')
bar()
bar()
二分法的应用
有一个从小到大排列的整型数字列表,判断某一个数字是不是在这个列表里面。
动图二分法查找数字23:
动图二分法查找数字1:
from random import randint
nums = [randint(1,100) for i in range(100)]
nums = sorted(nums)
print(nums)
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]
def search(search_num,nums):
mid_index = len(nums)//2
print(nums)
if not nums:
print('not exists')
return
if search_num > nums[mid_index]:
# in the right
nums = nums[mid_index+1:]
search(search_num,nums)
elif search_num < nums[mid_index]:
# in the left
nums = nums[:mid_index]
search(search_num,nums)
else:
print('find it')
search(7,nums)
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47]
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21]
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7]
[6, 6, 7, 7, 7]
find it