08,生成器和内置函数

1,生成器

yield 生成器函数

def func():
    print(111)
    print(222)
    yield 3
    a = 1
    b = 2
    c = a + b
    print(c)
    yield 4
    yield 5
    yield 6

ret = func()
print(func())
print(next(func()))
print(next(func()))
# 一个next()对应一个yield ,运行完一个yield既停止运行,next数量大于yield时也会报错
return yield
return:函数中只存在一个return 结束函数,并且给函数的执行者返回值。
yield:只要函数中有yield 那么他就是生成器函数而不是函数。
生成器函数中可以存在多个yield,yield不会结束生成器函数一个yield对应一个next

def func():
    print(111)
    yield 222
    return 111
ret = func()
print(ret)
print(next(ret))

生成器使用的例子:

# 吃包子
# 一次性做出来500个包子(函数做的)
def func():
    l1 = []
    for i in range(1,501):
        l1.append(f'{i}号包子')
    return l1

ret = func()
print(ret)

# 吃一个做一个(生成器做的)
def gen_func():
    for i in range(1, 501):
        yield f'{i}号包子'

yield from

def func():
    l1 = [1, 2, 3, 4, 5]
    yield l1


ret = func()
print(next(ret))  # [1, 2, 3, 4, 5]





def func():
    l1 = [1, 2, 3, 4, 5]
    yield from l1
'''
# 等价于:
        yield 1
        yield 2
        yield 3
        yield 4
        yield 5
'''




# 将l1这个列表变成迭代器返回
ret = func()
print(next(ret))        # 1
print(next(ret))        # 2
print(next(ret))        # 3
print(next(ret))        # 4
def func():
    lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配']
    lst2 = ['馒头', '花卷', '豆包', '大饼']
    yield from lst1
    yield from lst2


g = func()
for i in g:
    print(i)

2,列表推导式

用一行代码构建一个比较复杂有规律得列表
原来的方法
lis = []
for i in range(1, 11):
    lis.append(i)
print(lis)

列表推导式

lis = [i for i in range(1, 101)]
print(lis)

列表推导式的两类

循环模式:
# 将十以内的所有整数的平方写入列表
lis = [i*i for i in range(1, 11)]
print(lis)      # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 将100以内的所有偶数写入列表
lis = [i for i in range(2, 101, 2)]
print(lis)

# 从python1期到python100期写入列表
lis = [f'python{i}期' for i in range(1, 101)]
print(lis)
筛选模式:
# 30以内能被3整除的数
lis = [i for i in range(1, 31) if i % 3 == 0]
print(lis)        # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]


# 过滤掉长度小于3的字符串列表,并将剩下的转化成大写字母
li = ['fghfg','sdfh54565','ki','4','yjgy']
lis = [i.upper() for i in li if len(i) > 3]
print(lis)        # ['FGHFG', 'SDFH54565', 'YJGY']


# 找到嵌套列表中名字含有两个'e'的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
li = [i for i1 in names for i in i1 if i.count('e') == 2]
print(li)

总结:
# 列表推导式:
缺点:
    1,有毒:列表推导式只能构建比较复杂且有规律的列表。不能太着迷
    2,超过三层才能构建成功的,就不建议使用列表推导式。
    3,查找错误不行,不能进行调试
优点:
    1,简单,一行解决

3,生成器表达式

与列表推导式的写法几乎一模一样。也有筛选模式,循环模式,多层循环构建   不同:把[] 变成 ()
print([i for i in range(1, 11)])
列表推导式与生成器表达式的区别:
写法上:[]  ()
专业角度:iterable  iterator

4,字典推导式和集合推导式

# 字典推导式(了解)  两个字典的长度必须相同
lst1 = ['jay', 'jj', 'meet']
lst2 = ['周杰伦', '林俊杰', '郭宝元']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)
# 集合推导式(了解)
lst = [1, 2, 3, -1, -3, -7, 9]
s = {abs(i) for i in lst}
print(s)
print(set(lst))

5,内置函数

python 提供了68个内置函数。
# 了解即可一带而过:
all()  any()  bytes() callable() chr() complex() divmod() eval() exec() format() frozenset()  globals() hash() help() id() input() int()  iter() locals() next()  oct()  ord()  pow()    repr()  round()

# 重点讲解:
abs() enumerate() filter()  map() max()  min() open()  range() print()  len()  list()  dict() str()  float()  reversed()  set()  sorted()  sum()    tuple()  type()  zip()  dir()


# 未来会讲:
classmethod()  delattr() getattr() hasattr()  issubclass()  isinstance()  object() property()  setattr()  staticmethod()  super()
# 1:eval() **
# 剥去 字符创的外衣运算里面的代码。使用较少
s1 = '1 + 3'
print(s1)  # 1 + 3
print(eval(s1))  # 4

s = "{'name':'alex'}"
print(eval(s))  # {'name': 'alex'}
# 在网络传输的str input 输入的时候,sql注入等等 绝对不使用eval()
# 2,exec() 与eval() 几乎一样,代码流
msg = """
for i in range(10):
    print(i)
"""
print(msg)
print(exec(msg))

# 3,hash() 获取哈希值
print(hash('fgjfgbfbsdfb'))

# 4,help() **
# 打印或则获取对象的使用
print(help(str.find))

# 5,callable() ***
# 判断一个对象是否可调用,返回布尔值
s1 = 'sfdhs'


def func():
    pass


print(callable(s1))  # False
print(callable(func))  # True

# 6,int():函数用于将一个字符串或数字转换为整型
print(int())  # 0
print(int('12'))  # 12
print(int(3.6))  # 3
print(int('0100', base=2))  # 4

# 7,float():函数用于将整数和字符串转换成浮点数。
print(float())  # 0.0
print(float('12'))  # 12.0
print(float(3.6))  # 3.6

# 8,complex():函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。
# 如果第一个参数为字符串,则不需要指定第二个参数
print(complex(1, 2))  # (1+2j)

# 9,bin() **:将十进制转换成二进制并返回。
print(bin(10), type(bin(10)))  # 0b1010 <class 'str'>

# 10,oct() **:将十进制转化成八进制字符串并返回。
print(oct(10), type(oct(10)))  # 0o12 <class 'str'>

# 11,hex() **:将十进制转化成十六进制字符串并返回。
print(hex(10), type(hex(10)))  # 0xa <class 'str'>

# 12,divmod() **:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。
print(divmod(7, 2))  # (3, 1)

# 13,round() **:保留浮点数的小数位数,默认保留整数。
print(round(7 / 3, 2))  # 2.33
print(round(7 / 3))  # 2
print(round(3.32567, 3))  # 3.326

# 14,pow() **:求x**y次幂。(三个参数为x**y的结果对z取余)
print(pow(2, 3))  # 8 两个参数为2**3次幂
print(pow(2, 3, 3))  # 2 ,三个参数为2**3次幂,对3取余。 (2**3)/3
print(pow(2, 4, 5))  # 1

# 15,bytes():用于不同编码之间的转化。
s = '你好'
bs = s.encode('utf-8')
print(bs)  # b'\xe4\xbd\xa0\xe5\xa5\xbd'
s1 = bs.decode('utf-8')
print(s1)  # 你好
bs = bytes(s, encoding='utf-8')
print(bs)  # b'\xe4\xbd\xa0\xe5\xa5\xbd'
b = '你好'.encode('gbk')
b1 = b.decode('gbk')
print(b1.encode('utf-8'))  # b'\xe4\xbd\xa0\xe5\xa5\xbd'

# 16,ord():输入字符找该字符Unicode编码的位置,256以内的是ASCII编码 超过256找Unicode编码
print(ord('a'))  # 97
print(ord('中'))  # 20013

# 17,chr():输入位置数字找出其Unicode编码对应的字符
print(chr(97))  # a
print(chr(20013))  # 中

# 17,repr():返回一个对象的string形式(原形毕露)
# %r  原封不动的写出来
name = 'taibai'
print('我叫%r' % name)  # 我叫'taibai'

# repr 原形毕露
print(repr('{"name":"alex"}'), type('{"name":"alex"}'))  # '{"name":"alex"}' <class 'str'>
print('{"name":"alex"}', type({"name": "alex"}))  # {"name":"alex"} <class 'dict'>

# 18,all():可迭代对象中,全都是True才是True
print(all([1, 2, True, 0]))  # False

# 19,any():可迭代对象中,有一个True 就是True
print(any([1, '', 0]))  # True

更多内容可以查看自己学python的过程,简单笔记。-CSDN博客

更多内容可以查看自己学python的过程,简单笔记。-CSDN博客

更多内容可以查看自己学python的过程,简单笔记。-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值