函数迭代器、生成器、递归

迭代器

只要拥有__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:

53递归-二分23.gif

动图二分法查找数字1:

53递归-二分1.gif

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

posted @ 2019-06-03 20:12  小小罗code  阅读(244)  评论(0编辑  收藏  举报