Python进阶-迭代器、生成器、匿名函数

1.迭代器

  1)定义:迭代取值的工具

  2)优缺点

    优点

      a.提供一种不依赖索引取值的方法

      b.同时一时刻内存在存在的值只有一个,更加省内存

    缺点

      a.取值麻烦,只能通过next方法一个一个地往后取

      b.一次性读取,无法用len()读取

  3)可迭代对象

    在python中,但是内置有__iter__方法的对象,如列表、字典、字符串、元组、集合、文件,都是迭代对象

# 字符串
shs = 'hello'
iter_shs=shs.__iter__()
# 利用try进行异常处理
while True:
    try:
        print(iter_shs.__next__())
    except Exception as e:
        print('end...')
        break
# 文件
file = open(r'db.txt','rt',encoding='utf-8')
file_iter = file.__iter__()
while True:
    try:
        print(file_iter.__next__(),end='')
    except StopIteration:
        break

补充知识:

  for循环原理:for循环称之为迭代器循环,in后面跟的必须是可迭代对象!!!

  循环的过程实际上是通过调用next方法,从迭代器中把值一个一个地取出来

2.生成器

  1)定义:函数体内包含yiled的函数

  2)满足以上条件时,再次调用函数不会执行函数体内的代码,拿到的返回值就是一个生成器,生成器的本质就是迭代器,拿到的返回值就是一个生成器对象

总结:

  1)提供一种自定义的迭代器的方式

    可在函数内用关键字yiled,调用函数拿到的结果就是一个生成器即迭代器

  2)yiled可以向return一样用于返回值,区别是return只能返回一次,而yiled可但会对次,因为yiled可保存函数执行的状态

def func():
    print('first yield...')
    yield 1
    print('first second...')
    yield 2
    print('first third...')
    yield 3

# func()
# 查看func的类型
print(type(func))

yield_iter = func().__iter__()
print(yield_iter.__next__())
print(yield_iter.__next__())

3.三元表达式

# 三元表达式实现
# 1)
x = 10
y=13
res = x if x>y else y
print(res)

# 2)
def max(x,y):
    return x  if x>y else y
print(max(22,33))

3.函数递归调用

  1)在函数调用的过程中,直接或者间接地调用自身

    Python中默认最大递归次数为1000

# 查看Python内置的递归调用次数
import sys
print(sys.getrecursionlimit())
# 更改可递归次数
sys.setrecursionlimit(100)
print(sys.getrecursionlimit())

  2)递归的两个阶段

     a.回溯

     b.递推

  注意:一定要满足某种条件下结束回溯,否则递归到最大可递归次数

       因此递归一定要有明确的结束条件!!!

# 直接调用
def bar():
    print('from bar...')
    bar()
bar()

# 间接调用
def bar1():
    print('from bar...')
    foo()
def foo():
    print('from foo...')
    bar1()
try:
    bar1()
except Exception as e:
    print('超出递归次数')

4.匿名函数lambda

  1)定义   

    匿名的目的就是没有名字,就给匿名函数赋给另外一个值
    匿名函数的参数规则、作用域关系与有名函数一样
    匿名函数的函数体通常是一个表达式

func=lambda x,y,z=1:x+y+z
print(func(1,2,3))

  2)常用到匿名函数的内置方法

# max  min  sorted  map filter  reduce
salaries = {
    'egon':20000,
    'zhang':15000,
    'alex':25000,
    'boo':15100}
#  求工资最高的    max
print(max(salaries,key=lambda x:salaries[x]))
# 求工资最低的    min
print(min(salaries,key=lambda x:salaries[x]))

# 排序    sorted
# 倒序
print(sorted(salaries,key=lambda x:salaries[x],reverse=True))
# 升序
print(sorted(salaries,key=lambda x:salaries[x]))

# 重点!!!!!
# 映射    map
nums = [1,5,6,4,8,9]
res = map(lambda x:x*2,nums)
print(list(res))

names = ['zhang','alex','egon','boo']
res = map(lambda x:x+'_sb',names)
print(list(res))
res = map(lambda x:x+'_haha' if x == 'egon' else x+'_sb',names)
print(list(res))

# 合并  reduce
from functools import reduce
res = reduce(lambda x,y:x+y,range(1,101),0)
print(res)

l = ['my','name','is','alex','is','sb']
res = reduce(lambda x,y:x+' '+y,l)
print(res)

# filter
names = ['zhang_SB','alex_SB','egon_SB','boo']
# 过滤出指定格式
res = filter(lambda x:x.endswith('_SB'),names)
print(list(res))

ages = [7,8,9,10,55,33,10,20,66,44]
res = filter(lambda x:x>30,ages)
print(list(res))

info = {
    'zhang1':18,
    'zhang2':19,
    'zhang3':22
}

# # max取出一个值,filter可过滤出多个值
res = filter(lambda x:info[x] < 20,info)
print(list(res))
View Code

其他内置方法:

# abs() 把负值转换成正值
print(abs(-1))

# 判断对象是否可调用
print(callable(len))

# 全为真则真
print(all([1,'a',True,{'name':'zhang'}]))

# 一个为真则为真
print(any([0,'a',False,{'name':'zhang'}]))

# 进制转换
# 十进制转二进制、八进制、十六进制
print(bin(10))
print(oct(10))
print(hex(10))

# 将字符串转换成bytes类型
res = '你好egon'.encode('utf-8')
print(res)
res = bytes('你好egon',encoding='utf-8')
print(res)

# 根据ascii表的对应关系将数字转换成数字或者字母转成数字
print(chr(90))
print(ord('Z'))

# 查看对象可以调用的内置方法
print(dir('ass'))

# divmod()求商和余数
print(divmod(4,2))

# eval()将字符串内的表达式拿出来运行并拿到运行结果
print(eval('55*2'))

# 将文本内保存为字符串格式的字典去取出来并且把它转换成字典

# globals()查看全局作用域中的名字与值的绑定关系
# locals()查看局部作用域中的名字与值的绑定关系
x = 11
print(globals())

# hash()哈希,只能应用于可变类型
print(hash('zhang'))

# help()查看帮助信息,例如函数
print(help(max))
View Code

 

posted @ 2018-04-02 18:34  燕云十八骑_Z  阅读(177)  评论(0)    收藏  举报