02Python学习笔记之二.六【生成器、pdb调试】2019-08-18

章节号 内容            
1图片格式(png) 宽度大于620px,保持高宽比减低为620px
1-1 应用
1-1-1 方法

第1章节  生成器

  • 1-1 生成器—生成器的2种方式

  列表生成式:

In [17]: a=[x for x in range(10)]

In [18]: a
Out[18]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [21]: a=[x*2 for x in range(10)]

In [22]: a
Out[22]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

  什么是生成器:
  1、把列表生成式的[]改为()

In [25]: b=(x*2 for x in range(10))

In [26]: b
Out[26]: <generator object <genexpr> at 0x7fbf76db3eb8>

  怎么来使用?使用next(生成器名),一次一个。

In [27]: next(b)
Out[27]: 0

In [28]: next(b)
Out[28]: 2

In [36]: next(b)
Out[36]: 18

In [37]: next(b)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-37-adb3e17b0219> in <module>()
----> 1 next(b)

StopIteration: 

  斐波那契数列问题。
  2、使用yield
  引言,两数交换问题。

In [38]: a,b=0,1

In [39]: a,b=b,a

In [40]: a
Out[40]: 1

In [41]: b
Out[41]: 0
In [42]: a=9

In [43]: b=10

In [44]: a=a+b

In [45]: b=a-b

In [46]: a=a-b

In [47]: a
Out[47]: 10

In [48]: b
Out[48]: 9

  ↓这里使用列表的方式来实现斐波那契数列的计算。

def fab(n):
    a = [1, 1]
    
    for i in range(n):
        an = a[i]+a[i+1]
        a.append(an)
        # yield a
    print(a)

fab(10)
# c=fab(10)
# print(next(c))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

  ↓用yield实现:

def fab(n):
    a = [1, 1]
    
    for i in range(n):
        an = a[i]+a[i+1]
        a.append(an)
        yield a
    print(a)

print(fab(10))
c=fab(10)
print(next(c))
<generator object fab at 0x7f7f94fff1a8>
[1, 1, 2]

  ↑函数体内一旦声明了yield,此函数就会变成一个生成器。不再能被以普通的方式调用。
  1、首先要把函数赋给一个变量c=fab(10)
  2、使用next(c)来取生成器的值,或者a=c.__next__()来调用函数取得返回值。
  3、你yield谁,使用next()的时候,就返回谁。
  4、一般都是套在循环中,next()一次,执行一次循环。
  5、程序每次停在yield结束处,下一次next()从yield的下一句开始执行

In [4]: def fab(n):
   ...:     a = [1, 1]
   ...:     
   ...:     for i in range(n):
   ...:         an = a[i]+a[i+1]
   ...:         a.append(an)
   ...:         print("before yield")
   ...:         yield a
   ...:         print("after yield")
   ...:     print(a)
   ...: 
   ...: print(fab(10))
   ...: c=fab(10)
   ...: 
<generator object fab at 0x7fb98914dfa0>

In [5]: next(c)
before yield
Out[5]: [1, 1, 2]

In [6]: next(c)
after yield
before yield
Out[6]: [1, 1, 2, 3]

  如果没有循环会咋样呢?只能生成一次~

In [1]: def fab():
   ...:     a=0
   ...:     b=1
   ...:     c=a+b
   ...:     yield c
   ...: 
   ...: 
   ...: print(fab())
   ...: a=fab()
   ...: 
<generator object fab at 0x7fb98a1f65f0>

In [2]: next(a)
Out[2]: 1

In [3]: next(a)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-3-15841f3f11d4> in <module>()
----> 1 next(a)

  • 1-2 生成器—自动输出生成器返回值,不报错

def fab(n):
    a = [1, 1]
    
    for i in range(n):
        an = a[i]+a[i+1]
        a.append(an)
        # print("before yield")
        yield a
        # print("after yield")
    # print(a)

for t in fab(10):
    print(t)

[1, 1, 2]
[1, 1, 2, 3]
[1, 1, 2, 3, 5]
[1, 1, 2, 3, 5, 8]
[1, 1, 2, 3, 5, 8, 13]
[1, 1, 2, 3, 5, 8, 13, 21]
[1, 1, 2, 3, 5, 8, 13, 21, 34]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

  ↑一个生成器,可以中for循环来输入,放到in的后面即可。

  • 1-3 生成器—send

In [14]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         t = yield i
    ...:         print(t)
    ...:         i+=1
    ...: 
    ...: t1=test()
    ...: 

In [15]: next(t1)
Out[15]: 0

In [16]: next(t1)
None
Out[16]: 1

In [17]: t1.send("hhhhh")
hhhhh
Out[17]: 2

In [18]: next(t1)
None
Out[18]: 3

In [19]: t1.send("jjjjjjj")
jjjjjjj
Out[19]: 4

  ↑yield i本身是没有值的,一旦使用了send()函数,则相当于给yield i发送了一个值,这个值就会赋值给t,从而被打印出来。
  ↓send()next()都可以让程序往下走一步。第一次不能使用send()

In [21]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         t = yield i
    ...:         print(t)
    ...:         i+=1
    ...: 
    ...: t1=test()
    ...: 

In [22]: t1.send("1123")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-fb04f94f864c> in <module>()
----> 1 t1.send("1123")

TypeError: can't send non-None value to a just-started generator

  ↓非要使用,则必须传递一个None

In [25]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         t = yield i
    ...:         print(t)
    ...:         i+=1
    ...: 
    ...: t1=test()
    ...: 

In [26]: t1.send(None)
Out[26]: 0

In [27]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         if i==0:
    ...:             temp = yield i
    ...:         else:
    ...:             yield i
    ...:         i+=1
    ...:         print(temp)
    ...: 
    ...: t=test()
    ...: 

In [28]: next(t)
Out[28]: 0

In [29]: t.send("hahah")
hahah
Out[29]: 1

In [30]: next(t)
hahah
Out[30]: 2

In [31]: next(t)
hahah
Out[31]: 3

In [32]: next(t)
hahah
Out[32]: 4

In [33]: next(t)
hahah

  ↑如果yield这里有了一个赋值的操作,那么如果不使用send给yield x发送一个值,那么yield x就会产生一个None,从而给等号左边的变量赋值一个None,那么完全可以控制好程序的走向,从而把send()出去的值一直保留下来?这有什么用呢????????????

  • 1-4 生成器—完成多任务

  yield不是暂停的概念,而是本轮执行结束的概念。我结束了,那执行流就交给下一行代码。我等待下一次执行。

import time
def t1():
    while True:
        print("t1")
        yield None

def t2():
    while True:
        print("t2")
        yield None


t11=t1()
t22=t2()

while True:
    t11.__next__()
    t22.__next__()
    time.sleep(1)
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2

  ↑实现的效果就是t1和t2看上去同时执行。这就叫!!协程!!
  多任务分:进程、线程、协程

第2章节  pdb调试(命令行)

  如何开启调试

python3 -m pdb 名字.py

  交互调试,进入python或ipython解释器

import pdb

  调试命令:
  1、l 。显示当前代码list(不好使敲个n,再l)。
  2、n。 向下执行一行next(不进入函数)。
  3、c。 直接执行完毕continue。
  4、b 空格 行数。在制定行数加断点。
  5、b。查看断点序号。
  6、clear 断点序号。删除断点。
  7、s。执行进入函数。
  8、p 变量。查看变量数据。
  9、a。查看函数内参数。
  10、

  ↓小写字母l,查看执行流位置

li@li-System-Product-Name:~/py$ python3 -m pdb 2.py
> /home/li/py/2.py(1)<module>()
-> class person(object):
(Pdb) l
  1  -> class person(object):
  2         def __init__(self, name, age):
  3             self.__name = name
  4             self.__age = age
  5     
  6         def chaname(self, name):
  7             self.__name = name
  8     
  9         def chaage(self, age):
 10             if age <=100:
 11                 self.__age = age
(Pdb) 

  ↓小写字母n,执行一步

(Pdb) n
> /home/li/py/2.py(25)<module>()
-> ren = person("xiaom", 14)
(Pdb) 

  ↓再l看一下

(Pdb) l
 20             print(self.__age)
 21     
 22         def getname(self):
 23             return self.__name
 24     
 25  -> ren = person("xiaom", 14)
 26     ren.priname()
 27     ren.priage()
 28     
 29     ren.chaname("aaa")
 30     ren.chaage(1111)
(Pdb) 

  ↓c,直接执行完毕

li@li-System-Product-Name:~/py$ python3 -m pdb 2.py
> /home/li/py/2.py(1)<module>()
-> class person(object):
(Pdb) c
xiaom
14
输入的年纪非法
aaa
14
The program finished and will be restarted
> /home/li/py/2.py(1)<module>()
-> class person(object):

  ↓b空格7,回车,c。设断点,执行到断点。

(Pdb) b 6
Breakpoint 1 at /home/li/py/2.py:6
(Pdb) c
> /home/li/py/2.py(6)person()
-> def chaname(self, name):
(Pdb) l
  1     class person(object):
  2         def __init__(self, name, age):
  3             self.__name = name
  4             self.__age = age
  5     
  6 B->     def chaname(self, name):
  7             self.__name = name
  8     
  9         def chaage(self, age):
 10             if age <=100:
 11                 self.__age = age
(Pdb) 
  • 2-1 pdb调试—








  • 3-1 类的初步—定义一个类并创建对象实例

  ↑↓类的基本结构:

  • 1-1 类的初步—定义一个类并创建对象实例

  1-1-1. 导言—用户管理—用户的分类及介绍
  • 1-2 类的初步—定义一个类并创建对象实例

  1-2-1. 导言—用户管理—用户的分类及介绍

第2章节 

  • 2-1 类的初步—定义一个类并创建对象实例

  2-1-1. 导言—用户管理—用户的分类及介绍
  • 2-2 类的初步—定义一个类并创建对象实例

  2-2-1. 导言—用户管理—用户的分类及介绍

第3章节 

  • 3-1 类的初步—定义一个类并创建对象实例

  3-1-1. 导言—用户管理—用户的分类及介绍
  • 3-2 类的初步—定义一个类并创建对象实例

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