<jupyter_start><jupyter_text>七月在线 《Python基础入门 第三期》 第三课 Python编程基础（下）> [七月在线](https://www.julyedu.com) David@2018-12-08  本节课程目标 复习上节课内容  条件判断与三元表达式 循环与循环控制 可迭代对象，迭代器与生成器 异常与错误处理 完成课后作业：  Python 条件判断与三元表达式  判断：if， if else ,if elif<jupyter_code>#### 判断：if， if else ,if elif

#单if
age=88
if age<18:
    print('teenage')
    
#if else 
if age<18:
    print('teenage')
else:
    print('adult')
    
#if elif
if age<18:
    print('teenage')
elif age >18 and age <60:
    print('adult')
elif age>60:
    print('elder')
%whos<jupyter_output>Variable   Type    Data/Info
----------------------------
a          int     5
age        int     55<jupyter_text>三元表达式<jupyter_code>#三元表达式
age=18
'a' if age>50 else 'b'<jupyter_output><empty_output><jupyter_text>扩展阅读：Python三元表达的左右表达式问题<jupyter_code>a=b=c=15
a=5 if b>12 else 3#合法
a=3 if b>15 else 33

#感受一下，先判断，如果是，就对某变量操作，不是，还是对某变量操作和。。
#这也是为什么，expression只能放在左边，因为三元只能对一个变量操作。。<jupyter_output><empty_output><jupyter_text>循环与循环控制  For循环与While循环<jupyter_code>list(range(7))
item=5
while True:
    item=item+1
    if item>100:
        break
str1='julyedu.com'

for item in str1:
    print(item)
    
for item in range(7):
    if item==5:
        continue
    print (item)
    


countnum=1
while True:
    print(item)
    countnum+=1<jupyter_output>j
u
l
y
e
d
u
.
c
o
m
0
1
2
3
4
5
6
6<jupyter_text>break与continue循环控制<jupyter_code>#break 打破循环
#continue 跳过本次循环

i=0
while True:
    i+=1
    if i==3:
        continue
    if i>5:
        break
    print(i)<jupyter_output><empty_output><jupyter_text>列表/字典   推导式    List/Dict Comprehension，可迭代对象Iterable,迭代器iterator,生成器generator<jupyter_code>l1=[1,2,3,4,5]
l2=(item for item in range(1,7))
l1,l2
def g2_func(n):
    for i in range(n):
        yield i**2
        
g2=g2_func(50)
g2
for item in l2:
    print(item)
#列表推导式：从一个列表中生成一个新的列表，简化了循环的写法
l1= (x for x in range(30) if x%3==0)
l1

#字典推导式：从能生成k,v的循环中生成一个新的字典，简化了循环的写法
str1='i love china for ever!'
{item:itemno for itemno,item in enumerate(str1)}
#可迭代对象Iterable：可以被for循环的对象统称为可迭代对象Iterable,list,str,dict这些都是可迭代类型
#迭代器Iterator：可以被next调用的迭代器。
#next(l1) #TypeError: 'list' object is not an iterator

#使用iter将一来个可迭代对象变为迭代器
l1=iter(l1)
next(l1),next(l1)


#生成器Generator：首先是一个迭代器，然后其内容是按需生成
#列表是一次性生成，缺点是当内容过大时会占用大量内容，那能不能用到多少生成多少呢？
#Python里一边循环一边计算(惰性计算)的迭代器称为生成器（Generator）

#1.直接从列表表达式生成
g1= (x**2 for x in range(30) if x%2==0)
type(g1)
next(g1),next(g1),next(g1),next(g1),g1.__next__(),g1.__next__()

#2.函数生成，与yield关键字
def g2_func(n):
    for i in range(n):
        yield i**2
    
g2=g2_func(7)
next(g2),next(g2),g2.__next__(),g2.__next__(),g2.__next__(),g2.__next__()

#yield from/子迭代器，后面直接是可迭代对象。
def yield_from_iter(iter_object):
    yield from iter_object
    
y1=yield_from_iter('China')
y1.__next__(),next(y1)<jupyter_output><empty_output><jupyter_text>异常与调试<jupyter_code>#一个出现异常的例子
print(77/0)
print(77/6)
%debug
l2[80]<jupyter_output><empty_output><jupyter_text>异常/exception对象异常同样也是Python对象，表示一个在程序执行过程中发生了影响正常运行时而产生的一个事件(产生一个traceback.)   |常见异常|说明||---:|--:--||NameError|尝试访问一个没有申明的变量||ZeroDivisionError|除数为0||SyntaxError|语法错误||IndexError|索引超出序列范围||KeyError|请求一个不存在的字典关键字||IOError|输入输出错误（比如你要读的文件不存在）||AttributeError|尝试访问未知的对象属性||ValueError|传给函数的参数类型不正确，比如给int()函数传入字符串形|  开启调试<jupyter_code>#没发生异常，没有traceback就没办法debug.
#在错误异常发生时，我们可以运用%debug来开启调试
%debug
#### 开启自动调试
%pdb on
#异常发生时，调用堆栈帧被traceback保存，所以可以进行debug.
aslkdfjoiuwejlas
# a=1
# print(never_named_value)
# b=2
# print(never_named_value1)

def test(a,b,c=10):
    print(d)
    return a+b+c

test(5,4)

ff=33331
adea=333<jupyter_output><empty_output><jupyter_text>调试相关命令 |pdb 常用命令|解释||:--|:--||break 或 b |设置断点	设置断点||continue 或 c	|继续执行程序||list 或 l	|查看当前行的代码段||step 或 s	|进入函数||return 或 r	|执行代码直到从当前函数返回||pp	|打印变量的值||help	|帮助|```Documented commands (type help ):========================================EOF    cl         disable  interact  next    psource  rv         unt   a      clear      display  j         p       q        s          until alias  commands   down     jump      pdef    quit     source     up    args   condition  enable   l         pdoc    r        step       w     b      cont       exit     list      pfile   restart  tbreak     whatisbreak  continue   h        ll        pinfo   return   u          where bt     d          help     longlist  pinfo2  retval   unalias  c      debug      ignore   n         pp      run      undisplayMiscellaneous help topics:==========================exec  pdb```  主动设置断点进行调试<jupyter_code>#b列出所有已有断点, ignore,disable,enable,也可以指定文件名设置断点,也可以设置条件。 
import pdb

i= 0
while i<10:
    print(i)
    pdb.set_trace()
    i += 1
pdb.set_trace()
num=1<jupyter_output>0
> <ipython-input-44-1949a01f8362>(8)<module>()
-> i += 1
(Pdb) help

Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt      
alias  clear      disable  ignore    longlist  r        source   until    
args   commands   display  interact  n         restart  step     up       
b      condition  down     j         next      return   tbreak   w        
break  cont       enable   jump      p         retval   u        whatis   
bt     continue   exit     l         pp        run      unalias  where    

Miscellaneous help topics:
==========================
exec  pdb<jupyter_text>触发断点后的执行c,continue,执行到下一个断点n,next,单步执行   nn(ext)        Continue execution until the next line in the current function        is reached or it returns.        s,step，进入可调对象 栈帧选择w，输出整个调用栈，u,d上下选择前后栈帧 栈帧打印：`where,w````        Print a stack trace, with the most recent frame at the bottom.        An arrow indicates the "current frame", which determines the        context of most commands. 'bt' is an alias for this command.        Take a number as argument as an (optional) number of context line to        print``` 退出`q,quit,exit`Quit from the debugger. The program being executed is aborted.  捕获并处理异常对象  捕捉异常对象要使用try/except,或try/else,try/finally 语句    try语句用来检测try语句块中的错误，从而让except语句捕获异常信息并处理   例如NameError：在名字空间访问时出错时会导致，也是咱们上边课程一直讲到的<jupyter_code>a=never_named_value
print('end line')
#try except else 
try:
    a=never_named_value
    print(int(a))
except ValueError:#发生ValueError错误执行以下代码
    print ("Error: 函数参数传值错误")
except NameError:#发生NameError错误执行以下代码
    print ("Error: 名称空间使用出错")
else:
    print('Everything is fine')
    
print('end line')
    
#try-finally 无法是否捕获了异常，都会执行finally后的语句<jupyter_output>Error: 名称空间使用出错
end line<jupyter_text>延伸阅读：追踪(traceback) 当简单的异常处理给我们的信息已经无法解决调试问题时，可以使用traceback对象进行深入观察。追踪是在出现异常时用于回溯的对象，与栈帧相反。由于异常时才会构建，而异常未捕获时会一直向外层栈帧抛出，所以需要使用try才能见到这个对象。   你可以使用sys模块的exc_info()函数获得它，这个函数返回一个元组，元素分别是异常类型、异常对象、追踪。   对象中包含出错的行数、位置等数据。traceback的属性全部是只读，例如如下属性:- tb_next: 追踪的下一个追踪对象- tb_frame: 当前追踪对应的栈帧- tb_lineno: 当前追踪的行号<jupyter_code>import sys, traceback
    
try:
    a=never_named_value
    print(int(a))
except ValueError:#发生ValueError错误执行以下代码
    print ("Error: 函数参数传值错误")
except NameError:#发生NameError错误执行以下代码
    print ("Error: 名称空间使用出错")
    
    #使用sys.exc_info获得tb对象
    exc_type, exc_value, exc_traceback_obj=sys.exc_info()
    print('元组内三个对象',exc_type, exc_value, exc_traceback_obj)
    
    #直接打印tb对象内的主要信息
    traceback.print_exc() 
    #traceback对象内更多内容
    print('tb对象内更多信息',exc_traceback_obj.tb_frame,exc_traceback_obj.tb_lasti)
else:
    print('Everything is fine')<jupyter_output>Error: 名称空间使用出错
元组内三个对象 <class 'NameError'> name 'never_named_value' is not defined <traceback object at 0x000001F2A1D5E208>
tb对象内更多信息 <frame object at 0x000001F2A1C299F8> 2<jupyter_text>手动抛出异常除了由程序触发异常，也可以使用`raise`手动抛出一个通用的异常类型<jupyter_code>raise ValueError('类别错误') 
def addfunc(a,b):
    if type(a)!=type(b):
        raise ValueError('类别错误') #或者 raise ValueError,'Invalid value'
    return a+b

addfunc(5,'f')

if len(list(range(12))) <= 10:
    raise AssertionError('list has too less items')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12430520464881253, 'fraction_numerical': 0.025644264780192015, 'mean_word_length': 3.809842041312272, 'pattern_counts': {'":': 0, '<': 56, '<?xml version=': 0, '>': 60, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '319822', 'license': 'Apache-2.0', 'n_tokens_mistral': 3897, 'n_tokens_neox': 4143, 'n_words': 618, 'path': 'Python3.ipynb', 'repo_name': 'zengqingxue/ML_cases', 'size': '7916'}