zoukankan      html  css  js  c++  java
  • python 基础 05 生成器,列表推导式,次要的内置函数

    python 基础 05

    1.生成器

    #生成器
    #生成器的本质就是迭代器。他与迭代器的区别是,生成器是我么自己用py#thon代码构建的数据结构,迭代器是他提供的,或者转化来的
    
    #获取生成器的三种方式:
    ##生成器函数
    ##生成器表达式
    ##python内部提供的一些
    
    #生成器函数获取生成器
    
    def func():
    	print(111)
    	print(222)
    	yield 3
    	yield 4
    ret = func() 
    #ret就变成了生成器对象,因为生成器本质上是个迭代器,所以这个ret就是个迭代器对象,普通打印只能打印内存地址
    print(ret)  #<generator object func at 0x01DA83E0>
    #要想打印ret,要用到 next() 函数 或 __next__ 方法
    print(next(ret))  #或 print(ret.__next__())
    print(ret.__next__())
    
    
    #return yield
    #return : 函数中只存在一个return结束函数,并且给函数执行者返回值
    #yield  : 只要函数中有 yield ,函数就是生成器函数,yield 不结束
    # 函数,一个yield对应一个next()
    
    #吃包子
    #用可迭代对象
    def func3():
    	l1 = []
    	for i in range(1,5001):
    		l1.append(f"{i}号包子")
    	return l1
    ret = func3()
    print(ret)
    
    #用生成器
    def func2():
    	for i in range(1,5001):
    		yield f"{i}号包子"
    
    ret = func2()
    
    for i in range(200):
    	print(next(ret))
    
    
    #yield from
    def func4():
    	l1 = [1,2,3,4,5]	
    	yield from l1
    	#将列表变成迭代器返回
    ret =  func4()
    print(next(ret))
    print(next(ret))
    print(next(ret))
    print(next(ret))
    print(next(ret))
    
    #如果使用多个 yield from,那就会先把第一个 yield from 迭代完了再执行第二个
    
    def func():
        lst1 = ['卫龙','老冰棍','北冰洋','牛羊配']
        lst2 = ['馒头','花卷','豆包','大饼']
        yield from lst1
        yield from lst2
        
    g = func()
    #因为,g是个迭代器了,就可以直接用for 循环去遍历他,然后打印,for循环内
    #本来就是要把可迭代对象转换为迭代器然后一个一个执行的
    for i in g:
        print(i)
        
    # 简述一下yield 与yield from的区别。
    #
    # 看下面代码,能否对其简化?说说你简化后的优点?
    #
    #
    def chain(*args):
        # ('abc',(0,1,2))
        for it in args:
            for i in it:
                yield i
    g = chain('abc',(0,1,2))
    怎么让生成器产出值?
    next ,for 循环, 转化成list
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(list(g))
    print(list(g))  # 将迭代器转化成列表
    
    
    def chain(*args):
        # ('abc',(0,1,2))
        for it in args:
            yield from it  # 'abc'  (0,1,2)
    g = chain('abc',(0,1,2))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(list(g))
    
    # yield from 优化了内层循环,提高了效率。
    def func():
        # yield [1,2,3]
        yield from [1,2,3]
        '''
        yield 1
        yield 2
        yield 3
        '''
    g = func()
    print(next(g))
    print(next(g))
    print(next(g))
    

    2.列表推导式

    #用一行代码构建一个比较复杂且有规律的列表
    #列表推导式分为两种:
    #1.循环模式:[表达式 for i in iterable] 
    #2.筛选模式:[表达式 for i in iterable if 条件]
    #列表推倒式只能构建比较复杂且有规律的列表
    #超过三层循环才能构建成功的列表不推荐使用
    #查找错误能力低,不好看出来错误。debug模式不行
    #但是列表推导式更简单,更装逼。
    
    #比如我们创建一个含有1-10的列表,原来都这么干
    l1=[]
    
    for i in range(1,11):
    	l1.append(i)
    
    print(l1)
    
    #用列表推倒式
    l1 = [i for i in range(1,11)]
    print(l1)
    
    #循环模式
    ##将10以内所有整数的平方写入列表
    l2 = [i*i for i in range(1,11)]
    print(l2)
    
    ##100以内所有的偶数写入列表
    l3 = [i for i in range(1,101) if i%2==0]
    print(l3)
    
    ##从'python1期'到'python100期'写入列表lst
    l4 = [f'python{i}期' for i in range(1,101)]
    print(l4)
    
    #筛选模式
    ##30以内能被3整除的数
    l5 = [i for i in range(1,31) if i%3==0]
    print(l5)
    
    #过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    l = ['wusir', 'laonanhai', 'aa', 'b', 'taibai']
    l6 = [i.upper() for i in l if len(i)>=3]
    print(l6)
    
    #找到嵌套列表中名字含有两个‘e’的所有名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    
    l7 = [name for i in names for name in i if name.count('e')==2]
    print(l7)
    
    #用列表推导式构建一个列表[2,3,4,5,6,7,8,9,10,'J','Q','k','A']
    l8 = [i for i in range(2,11)]+list('JQKA')
    print(l8)
    

    3.生成器表达式

    #生成器表达式
    #与列表推倒式写法几乎一模一样
    #就是把列表推倒式的中括号[]改成小括号()
    #与列表推导式的区别
    #写法上:[] ()
    #本质上,列表推导式得到个iterable对象,生成器表达式得到一个生成器iterator
    
    
    #列表推导式
    print([i for i in range(1,11)])
    
    #生成器表达式,有点就是省内存
    obj = (i for i in range(1,11))
    
    for i in obj:
    	print(i)
    
    

    4.字典推导式与集合推导式

    #字典推导式
    #
    lst1 = ['jay','jj','meet']
    lst2 = ['周杰伦','林俊杰','郭宝元']
    
    dict1 = {lst2[i]:lst1[i] for i in range(len(lst1))}
    print(dict1)
    
    #集合推导式
    s1 = {i for i in range(1,11)}
    print(s1)
    

    5.次要的内置函数

    #内置函数 68个
    #这个文件里边的,了解就好
    #次重要的内置函数
    
    # eval() 剥去字符串外衣,把字符串当代码运行,这个东西很危险据说,
    # 在网络传输的 str input 输入的时候,sql注入的时候绝对不用
    # eval()是有返回值的
    s1 = '1 + 3'
    print(s1)
    print(eval(s1))
    
    s = '{"name":"alex"}'
    print(s,type(s))
    #print(dict(s)) #会报错
    print(eval(s),type(eval(s)))
    
    # exec() 与eval()几乎一样,处理代码流的
    msg = '''
    for i in range(10):
    	print(i)
    '''
    print(msg)
    exec(msg)
    
    #hash() 获取一个对象的哈希值
    # 不可变对象才具有哈希值
    
    print(hash('owfjfosjfio'))
    
    # help() 获取方法对象的使用方法
    print(help(str))
    print(help(str.upper))
    
    # callable() 判断一个对象是否可调用,就是能不能加括号()
    s1 = 'jsofjiofjio'
    print(callable(s1))
    def func():
    	pass
    print(callable(func))
    
    # int() 将一个字符串或数字转换为整型
    
    # float() 将整数或字符串转换成浮点数
    
    # complex() 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数
    print(complex(1,2))
    
    # bin() 将十进制转化为二进制字符串并返回
    print(bin(10),type(bin(10)))  # 0b1010 <class 'str'>
    
    # oct() 将十进制转化为八进制字符串并返回
    print(oct(10),type(oct(10)))  # 0o12 <class 'str'>
    
    # hex() 将十进制转换为十六进制字符串并返回
    print(hex(10),type(hex(10)))  # 0xa <class 'str'>
    
    # divmod() 计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)
    print(divmod(7,2))  # (3, 1)
    
    # round() 保留浮点数的小数位数,默认保留整数
    print(round(7/3,2))
    print(round(7/3))
    print(round(3.1415926,3))
    
    # pow() 求x**y次幂,三个参数为 x**y 的结果对 z 取余(取对数)
    print(pow(2,3))
    print(pow(2,3,3))
    
    # bytes() 用于不同编码之间的转化
    s = '你好'
    bs = s.encode('utf-8')
    print(bs)
    s1 = bs.decode('utf-8')
    print(s1)
    bs = bytes(s,encoding='utf-8')
    print(bs)
    b = '你好'.encode('gbk')
    b1 = b.decode('gbk')
    print(b1.encode('utf-8'))
    
    # ord() 输入字符找该字符的编码的位置
    print(ord('a'))
    print(ord('中'))
    
    # chr 输入位置数字找出其相对应的字符
    print(chr(97))
    print(chr(20013))
    
    # repr() 返回一个对象的 string 形式,原形毕露
    #%r  原封不动的写出来
    name = 'taibai'
    print('我叫%r'%name)
    
    # repr 原形毕露
    print(repr('{"name":"alex"}'))
    print('{"name":"alex"}')
    
    # all() 可迭代对象中全是 True 才是 True
    print(all([1,2,True,0]))
    
    # any() 可迭代对象中,有一个True 就是 True
    print(any([1,'',0]))
    
    
  • 相关阅读:
    C基础-2 数组指针测试
    C基础-2 指针数组测试
    cesium + mapbox 的三种方式
    Fiddler 拦截 https 请求
    Fiddler 拦截请求修改数据
    开窗函数 SUM() OVER()
    ASP.NET中GridView和Repeater重复数据如何合并
    SQL Server 索引优化 ——索引缺失
    C# LINQ和Lambda表达式详解
    html+js实现登录的账号密码保存
  • 原文地址:https://www.cnblogs.com/fallen043/p/12700116.html
Copyright © 2011-2022 走看看