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]))

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容