Python学习笔记8:Python条件和循环

时间:2022-12-26 00:06:41

1、if语句

if expression:
expr_true_suite

单个if语句可以通过使用布尔操作符and、or和not实现多重判断条件和否定判断条件。

2、else语句

if expression:
expr_true_suite
else:
expr_false_suite

避免“悬挂else”(C语言代码)

if(balance>0.00)
if(((balance-atm)>min_bal)&&(atm_cashout()==1))
printf("Here's your cash;...");
else
printf("Your balance is ...");

本来①与③匹配,但C语言默认②与③匹配。

3、elif(即else-if)语句

if expression1:
expr1_true_suite
elif expression2:
expr2_true_suite
else:
none_of_the_above_suite

Python没有提供switch/case语句,可以用if-elif、序列和成员关系操作符、Python字典来代替。

4、条件表达式(三元操作符)
(C and [x] or [y])[0](2.5之前条件表达式的模拟实现之一)
x if C else y(2.5)

>>>smaller=x if x<y else y

5、while语句

while expression
suite_to_repeat

6、for语句(像C#中的foreach循环)
可以遍历序列成员,可以用在列表解析和生成器表达式中。

for iter_var in iterable:
suite_to_repeat

(1)遍历序列对象:字符串、列表及元组。
①通过序列项迭代:

>>>nameList=['adas','adaw','eew']
>>>for eachName in nameList:
>>> print eachName

②通过序列索引迭代

>>>nameList=['adas','adaw','eew']
>>>for nameIndex in range(len(nameList)):
>>> print nameList[nameIndex]

③使用项和索引迭代

>>>nameList=['adas','adaw','eew']
>>>for i,eachName in enumerate(nameList):
>>> print i,eachName

(2)遍历迭代器类型
迭代器对象有一个next()方法,调用后返回下一个条目。所有条目迭代完后,迭代器会引发一个StopIteration异常告诉程序循环结束。for语句在内部调用next()方法并捕获异常。
(3)range()和xrange()内建函数
①range()标准用法
range(start,end,step=1)
range()函数会返回一个包含所有k的列表,k大于等于start且小于end,从start到end,k每次递增step。step不可以为0,否则会发生错误。step默认为1。
②range()简略用法
range(end) start默认为0,step默认为1
range(start,end) step默认为1
③xrange()函数
xrange()适用于很大范围的列表。其性能高于range(),因为它不生成整个列表。它不会在内存里创建列表的完整拷贝。只被用在for循环,for循环外使用它无意义。xrange()返回一个可迭代对象(不是列表也不是迭代器)
④与序列相关的内建函数

  • sorted() 返回列表
  • reversed()返回迭代器
  • enumerate()返回迭代器
  • zip()返回列表

8、break与continue语句

  • break语句结束当前循环然后跳转到下条语句
  • continue语句结束当前循环开始下一次循环

9、pass语句(不做任何事情)

def foo_func():
pass

10、在while和for循环中使用else语句(循环后处理)

while expression:
suite_to_repeat
else:
else_suite

else子句只在循环完成后执行,也就是说break语句也会跳到else块。

11、迭代器和iter()函数
(1)迭代器
迭代器,为类序列对象提供了一个类序列的接口。(2.2)
Python的迭代无缝地支持序列对象,且允许程序员迭代非序列类型,包括用户定义的对象。例如:字典的键,一个文件的行,等等。
迭代器有一个next()方法,当你循环时,需要下一个项,调用迭代器的next()方法便可以获得它。条目全部取出后,会引发StopIteration异常,告诉调用者迭代完成。将迭代器看作序列,只是不能通过索引来计数。

  • reversed()内建函数将返回一个反序访问的迭代器;
  • enumerate()内建函数同样也返回迭代器。
  • all()和any()内建函数(2.5),如果迭代器中某个/所有条目的值都为布尔真时,则它们返回值为真。

迭代器限制:不能向后移动,不能回到开始,不能复制一个迭代器。
itertools模块,包含各种迭代器。
(2)使用迭代器
①序列中使用迭代器
for循环会自动调用迭代器的next()方法以及监视StopIteration异常。
②字典中使用迭代器
字典的迭代器会遍历它的键(key),语句for eachKey in myDict.keys()可以缩写为for eachKey in myDict。Python还提供了myDict.iterkeys()、myDict.itervalues() 、myDict.iteritems()三个内建字典方法来定义迭代。
③文件中使用迭代器
文件对象生成的迭代器会自动调用readline()方法。可以使用更简单的for eachLine in myFile替换for eachLine in myFile.readlines()。
注意:在迭代可变对象(列表)时修改它们不是一个好主意。因迭代器是与实际对象绑定在一起,更改元素会立即反映到你所迭代的条目上。
(3)iter()方法

  • iter(obj)方法可以得到obj的迭代器。iter()方法会检查入参obj是不是一个序列,如果是,根据索引从0一直迭代到序列结束。一个实现了__iter__()和next()方法的类可以作为迭代器使用。
  • iter(func,sentinel)重复调用func,直到迭代器的下个值等于sentinel。

12、列表解析(2.0)(用来动态创建列表)
(1)列表解析的语法
[expr for iter_var in iterable]

>>>[x**2 for x in range(6)]<=>map(lambda x:x**2,range(6))

列表解析可取代内建的map()及lambda,且效率更高
(2)列表解析语法的扩展版本
[expr for iter_var in iterable if cond_expr]

>>>[x**2 for x in seq if x%2]<=>filter(lambda x:x%2,seq)

13、生成器表达式(是列表解析的一个扩展)
(2.2引入生成器,2.4引入生成器表达式)
列表解析的不足是必须生成所有的数据,用以创建整个列表,不适用于有大量数据的迭代器。生成器是特定的函数,允许你返回一个值,然后“暂停”代码的执行,稍后恢复。
生成器表达式结合列表解析和生成器来解决列表解析的不足。生成器表达式并不真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。生成器表达式使用了“延迟计算”,在使用内存上更高效。
列表解析语法
[expr for iter_var in iterable if cond_expr]
生成器表达式语法
(expr for iter_var in iterable if cond_expr)
只是将方括号变成圆括号,却得到一个内存使用更友好的结构。