注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

互联网产品经理的窝

梦想社:一个人为了梦想,始终没有停下自己的脚步

 
 
 

日志

 
 

《Python基础教程》学习笔记之[D6]条件、循环和其他语句  

2012-05-11 18:52:09|  分类: python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

第五章 条件、循环和其他语句

 

注意:注意代码的缩进,否则会报错,因为是通过缩进来区分代码块的。用Tab或者两个空格或四个空格,但应保持一致,不要混用,决定用tab键方便。

 

1. ","  连续输出,以空格分隔

Python代码  
  1. >>> print 'Age',42  
  2. Age 42  
  3.   
  4. #  
  5. >>> for i in range(10):     
  6.     print i,        #语句以逗号结尾,print语句会在一行内打印,并以空格分开;若无逗号,则分行打印  
  7.   
  8.       
  9. 0 1 2 3 4 5 6 7 8 9  

 

   不需使用格式化字符%,更加方便

Python代码  
  1. >>> a = '1'  
  2. >>> b = '2'  
  3. >>> c = '3'  
  4. >>> print a,b,c  
  5. 1 2 3  

 

   使用print时,以","隔开,不能组成元组。而不用print以逗号隔开,则是一个元组

Python代码  
  1. >>> print 1,2,3   #打印以空格隔开的数字  
  2. 1 2 3  
  3. >>> 1,2,3    #元组  
  4. (123)  
  5. >>> print (1,2,3)   #打印元组  
  6. (123)  

 

2. import

 

   一般格式:

   import module
   from module import function1, function2

   from module import*

   还可以使用as来进行重命名,解决不同模块,相同函数名问题。

Python代码  
  1. >>> import math as m  
  2. >>> m.sqrt(4)  
  3. 2.0  
  4. >>> from math import sqrt as s  
  5. >>> s(4)  
  6. 2.0  

 

3. 赋值

   多个赋值操作同时进行

Python代码  
  1. >>> x,y,z = 1,2,3  
  2. >>> print x,y,z  
  3. 1 2 3  
 

   两个元素值交换(很简单)

Python代码  
  1. >>> x,y,z = 1,2,3  
  2. >>> x,y = y,x  
  3. >>> print x,y,z  
  4. 2 1 3  

 

   序列解包:将多个值的序列解开,放到变量的序列中

Python代码  
  1. >>> x,y,z = (1,2,3)  
  2. >>> x  
  3. 1  

 

   当函数或方法返回元组时,很有用

Python代码  
  1. >>> d = {'a':'1','b':'2'}  
  2. >>> key, value = d.popitem()   #popitem()随机弹出一组键值对,并解包分别赋值  
  3. >>> key  
  4. 'a'  
  5. >>> value  
  6. '1'  

 

   注意 “=”两边元素数量需要相等,否则报错。

 

4. 链式赋值 x = y = somefunction(),引用相同,与x=somefunction(),y =somefunction()不一定相同

    三元运算: a if b else c,如果b为真则返回b赋值给a,若b为假,则返回c值赋值给a

 

5. if something: do something

    elif something: do something

    else: do something

    注意冒号(:),以及elif

 

6. is(is not)判断同一性,==判断相等性

Python代码  
  1. >>> x = y = [1,2,3]    #x和y绑定到同一列表  
  2. >>> z = [1,2,3]          #z绑定到一个新的列表  
  3. >>> x == y                #值相等  
  4. True  
  5. >>> x == z                #值相等  
  6. True  
  7. >>> x is y                    #x和y是同一个对象  
  8. True  
  9. >>> x is z                   #x和z不是同一个对象  
  10. False  

 

7. 断言assert——在错误条件出现时,直接让程序崩溃

Python代码  
  1. >>> age = -1  
  2. >>> assert 0 < age < 100  
  3.   
  4. Traceback (most recent call last):  
  5.   File "<pyshell#45>", line 1in <module>  
  6.     assert 0 < age < 100  
  7. AssertionError  
  8. >>>   
  9. >>> #也可以添加字符串来解释断言  
  10. >>> age = -1  
  11. >>> assert 0 < age < 100'The age must be realistic'  
  12.   
  13. Traceback (most recent call last):  
  14.   File "<pyshell#49>", line 1in <module>  
  15.     assert 0 < age < 100'The age must be realistic'  
  16. AssertionError: The age must be realistic  
 

8. while & for——能用for,尽量不用while

   注意:别漏掉冒号(:);输入完成后,需按两次回车程序才能运行

   while

Python代码  
  1. >>> x = 1  
  2. >>> while x <= 100:  
  3.     print x  
  4.     x += 1  

 

    for

Python代码  
  1. >>> words = ['Hello''world']  
  2. >>> for word in words:  
  3.     print word  
  4.   
  5. #结果  
  6. Hello  
  7. world  

 

   range()迭代某范围内的数字,range(a,b)包括a,不包含b; range(b),从0到b-1

   xrange()类似range(),但range()一次创建整个序列,而xrange一次创建一个数,当迭代大序列时,xrange效率高

Python代码  
  1. >>> range(10)  
  2. [0123456789]  
  3. >>> range(010)  
  4. [0123456789]  
  5. >>> for n in range(5):  
  6.     print n  
  7.   
  8. #结果   
  9. 0  
  10. 1  
  11. 2  
  12. 3  
  13. 4  

 

   for遍历字典

Python代码  
  1. >>> d = {'a':'1','b':'2','c':'3'}  
  2. >>> for key in d:  
  3.     print key, 'corresponds to', d[key]  
  4.   
  5. #结果  
  6. a corresponds to 1  
  7. c corresponds to 3  
  8. b corresponds to 2  
  9. >>>   
  10. >>> for key, value in d.items():      #>>> d.items()  #将键值对作为元组返回  
  11.     print key, 'corresponds to', value    #[('a', '1'), ('c', '3'), ('b', '2')]  
  12.   
  13. #结果   
  14. a corresponds to 1  
  15. c corresponds to 3  
  16. b corresponds to 2  
 

9. 迭代工具

(1)并行迭代——zip()

    例1(1)通常情况

Python代码  
  1. >>> names = ['anne''beth''george''damon']  
  2. >>> ages = [124532102]  
  3. >>> for i in range(len(names)):  
  4.     print names[i], 'is', ages[i], 'years old'  
  5.   
  6. #结果   
  7. anne is 12 years old  
  8. beth is 45 years old  
  9. george is 32 years old  
  10. damon is 102 years old  

 

   例1(2)另一种简单方法,zip(),将两个序列压缩在一起,返回元组列表

Python代码  
  1. >>> zip(names, ages)  
  2. [('anne'12), ('beth'45), ('george'32), ('damon'102)]  
  3. >>> for name, age in zip(names, ages):  #这句话等同于1(1)的效果  
  4.     print name, 'is', age, 'years old'  
  5.   
  6. #结果   
  7. anne is 12 years old  
  8. beth is 45 years old  
  9. george is 32 years old  
  10. damon is 102 years old  

 

   zip()可以将任意多序列压缩,更特别的是,这些序列的长度可以不同,按最短序列来进行压缩

Python代码  
  1. >>> zip(range(5), xrange(1000000000)) #若xrange改为range会花费很长的时间  
  2. [(00), (11), (22), (33), (44)] #range会计算所有的数字,而xrange只需计算前五个数字  

 

(2)编号迭代——enumerate()

   通常方法

Python代码  
  1. #找到‘xxx’并修改为‘yyy’  
  2. >>> strings = ['xxx''is''a''doctor']  
  3. >>> index = 0  
  4. >>> for s in strings:  
  5.     if 'xxx' in s:          #注意是s而不是strings  
  6.         strings[index] = '[yyy]'  
  7.     index += 1  
  8.   
  9.       
  10. >>> strings  
  11. ['[yyy]''is''a''doctor']  

 

   简单方法——enumberate()

Python代码  
  1. >>> strings = ['xxx''is''a''doctor']  
  2. >>> for index, s in enumerate(strings):  
  3.     if 'xxx' in s:  
  4.         strings[index] = 'yyy'  
  5.   
  6.           
  7. >>> strings  
  8. ['yyy''is''a''doctor']  

 

(3)翻转和排序迭代——reversed()和sorted(),对副本进行修改,原对象不变

Python代码  
  1. >>> sorted([43683])  
  2. [33468]  
  3. >>>   
  4. >>> reversed('Hello, world!')   #返回对象  
  5. <reversed object at 0x01F14770>  
  6. >>> list(reversed('Hello, world!'))   #将对象转为列表  
  7. ['!''d''l''r''o''w'' '',''o''l''l''e''H']  
  8. >>> ''.join(reversed('Hello, world!'))  
  9. '!dlrow ,olleH'  
 

10. 带有步长的range(),用来跳过某些数字,或逆序

Python代码  
  1. >>> range(0102)  
  2. [02468]  
  3. >>> range(100, -1)  
  4. [10987654321]  

 

11. while、break

Python代码  
  1. >>> while True:    #采用True  
  2.     word = raw_input('Please enter a word: ')  
  3.     if not word: break     #当用户不输入是,word为空,所以为false  
  4.     print 'The word was', word  
  5.   
  6.       
  7. Please enter a word: test  
  8. The word was test  
  9. Please enter a word:   
  10. >>>   

 

12. for、break、else

Python代码  
  1. >>> from math import sqrt  
  2. >>> for n in range(9981, -1):  #99~80,不包括81  
  3.     root = sqrt(n)  
  4.     if root == int(root):  
  5.         print n  
  6.         break  
  7. else:        #只有当break不执行时,才执行else  
  8.     print "Didn't find it!"  
  9.   
  10. #结果   
  11. Didn't find it!  

 

13. 列表推导式——利用其他列表创建新列表

   类似for循环

Python代码  
  1. >>> [x*x for x in range(10)]  
  2. [0149162536496481]  
 

   添加条件语句

Python代码  
  1. >>> [x*x for x in range(10if x % 3 == 0]  
  2. [093681]  

 

   多个for

Python代码  
  1. >>> [(x, y) for x in range(3for y in range(3)]  
  2. [(00), (01), (02), (10), (11), (12), (20), (21), (22)]  

 

   多个for+if条件

Python代码  
  1. >>> girls = ['alice''bernice''clarice']  
  2. >>> boys = ['chris''arnold''bob']  
  3. >>> [b + '+' + g for b in boys for g in girls if b[0] == c[0]]  

 

14. pass、del、exec和eval

   (1)pass 什么也不做

Python代码  
  1. >>> name = 'd'  
  2. >>> if name == 'a':  
  3.     print '1'  
  4. elif name == 'b':  
  5.     #未完成  
  6.     pass  
  7. else:  
  8.     print '3'  
  9.   
  10.       
  11. 3  
 

   (2)del

   a和b绑定到同一字典,但a赋值为None时,b仍指向那个字典,a = None,只是消除了引用,即a不再指向字典,字典还在,b仍然指向字典。而b = None,将b的引用也消除,此时字典漂浮在内存中,没有名字绑定在它上面,python解释器自动删除。但是,名字a和b仍存在

Python代码  
  1. >>> b = a = {'a':1'b':2'c':3}  
  2. >>> a = None  
  3. >>> b  
  4. {'a'1'c'3'b'2}  
  5. >>> b = None  

 

   del不仅删除引用,也删除名字,但原对象不会被删除,也无法手动删除只有当原对象不再被使用时,python解释器才会自动回收

Python代码  
  1. >>> x = ["Hello""world"]  
  2. >>> y = x  
  3. >>> y[1] = "Python"  
  4. >>> x   #可以修改  
  5. ['Hello''Python']  
  6. >>> del x #删除x,只是将x的引用和x名字删除,而原来的列表不便无法删除,  
  7.                  #实际上不需要人为删除,当不用时python解释器会自动回收  
  8. >>> x  
  9.   
  10. Traceback (most recent call last):  
  11.   File "<pyshell#110>", line 1in <module>  
  12.     x  
  13. NameError: name 'x' is not defined  
  14. >>> y  
  15. ['Hello''Python']  

 

   (3)exec——执行字符串语句(执行一系列python语句)

Python代码  
  1. >>> exec "print 'Hello world!'"  
  2. Hello world!  

 

    有时会造成干扰

Python代码  
  1. >>> from math import sqrt  
  2. >>> exec "sqrt = 1"    #将sqrt当成一个变量执行  
  3. >>> sqrt(4)            #sqrt()函数与sqrt变量冲突  
  4.   
  5. Traceback (most recent call last):  
  6.   File "<pyshell#118>", line 1in <module>  
  7.     sqrt(4)  
  8. TypeError: 'int' object is not callable  

 

   解决方法,使用命名空间——通过增加in <scope>来实现

   使得潜在的破坏性代码不会覆盖原函数sqrt,原函数仍能继续工作,而通过exec赋值的sqrt变量只能在作用域中有效

Python代码  
  1. >>> from math import sqrt  
  2. >>> scope = {}   #命名空间  
  3. >>> exec 'sqrt = 1' in scope  #使用命名空间  
  4. >>> sqrt(4)   #原sqrt()方法可继续使用  
  5. 2.0  
  6. >>> scope['sqrt']  #exec执行的sqrt变量赋值仍可用  
  7. 1  

 

   (4)eval类似exec——但是执行Python表达式

Python代码  
  1. >>> eval(raw_input("Enter an arithmetic expression: "))  #类似input()  
  2. Enter an arithmetic expression: 6 + 2 *3  
  3. 12  

 

总结:注意链式赋值,del只删除名字和引用,多个变量同时赋值:x,y = (2,3);推导式赋值 [x*x for x in range(10) if x%3 == 0];缩进。

 

用到的函数

(1)chr(n),返回n的所代表的包含一个字符的字符串,0<=n<256,不太懂??
       >>> chr(1)
       '\x01'

(2)eval()

(3)enumerate(seq)产生用于迭代的对

Python代码  
  1. >>> for index, s in enumerate(['a''b''c']):  
  2.     print 'strings[%s] = %s' %(index,s)  
  3.   
  4.       
  5. strings[0] = a  
  6. strings[1] = b  
  7. strings[2] = c  

 (4)ord(c)返回单字符的int值

Python代码  
  1. >>> ord('a')  
  2. 97  

 (5)range([from,]to,[step])创建整数列表  xrange()一次一个整数用于迭代

 (6)reversed(seq) 逆序

 (7)sorted(seq[,cmp][,key][,reverse])排序

 (8)zip(seq1[,seq2.....])创造用于并行迭代的新序列

  评论这张
 
阅读(208)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017