1. 赋值语句常用技巧

通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中。解包的序列中的元素必须和等号左边变量数量一致。如下:

  1. values = 1,2,3
  2.  
  3. print values # output: (1, 2, 3)
  4.  
  5. x,y,z = values # output: 1 2 3
  6. print x,y,z
  7.  
  8. bob_Info = {'name':'Bob','email':'bob@gmail.com'}
  9. key,value = bob_Info.popitem()
  10.  
  11. print value # output: Bob

1.2 链式赋值

通过使用链式赋值(chained assignment)可以将一个值同时赋给多个变量,如下:

  1. x = y = z = 1
  2.  
  3. print x,y,z # output: 1 1 1

1.3 增量赋值

将表达式运算符(+-*%/等)放置在赋值运算符(=)的左边,这些写法被称为增量赋值(augmented assignment),如下:

  1. x = 6
  2.  
  3. x += 1
  4. print x # output: 7
  5.  
  6. x *= 6
  7. print x # output: 42

2. 缩进 —— Python语言的风格

Python和其他语言有一个很大的区别在于:Python 使用硬回车来分割语句,使用冒号(:)和缩进来分割代码块。同一层次的语句必须有相同的缩进(每一组这样的语句称为一个块),而C语言风格的编程语言(Java/C#/C++)则使用分号来分割语句,花括号来分割代码块。

正确的缩进

不要混合使用tab键和空格来进行缩进,这会使程序在跨平台时不能正常的工作。官方推荐的做法是使用四个空格

如下:

  1. # --- coding: utf-8 ---
  2.  
  3. age = 20
  4. if age < 21:
  5. print '不能买酒'
  6. print '但是你可以来块口香糖'
  7.  
  8. print '这句话处于If语句的外部'

3. 条件和条件语句

在Python中解释器认为标准值False、None和所有类型的数字0(浮点型,长整型等)、空序列(字符串、字典、列表等)都为假(False),如下所示:

  1. print bool(False) # False
  2. print bool(None) # False
  3. print bool(0) # False
  4. print bool("") # False
  5. print bool(()) # False
  6. print bool([]) # False
  7. print bool({}) # False

3.2 条件执行和if语句

和C#中的If语句类似,如果if内的条件判定为真,则执行后面的语句块:

  1. # -- coding: utf-8 --
  2. age = 18
  3.  
  4. if age >= 18:
  5. print '年龄超过18岁了'

3.3 else子句

else子句作为if语句的一部分,如果if语句的条件被判定为“False”则执行else子句后的语句块,如下:

  1. # -- coding: utf-8 --
  2. age = 16
  3.  
  4. if age >= 18:
  5. print '年龄超过18岁了'
  6. else:
  7. print '未成年人'

3.4 elif子句

elif子句是“else if”的简写,通过elif子句可以检查更多的条件,如下:

  1. num = input('Enter a number: ')
  2.  
  3. if num > 0:
  4. print 'The number is positive'
  5. elif num < 0:
  6. print 'The number is negative'
  7. else:
  8. print 'The number is zero'

3.5 嵌套代码块

有时候我们需要更加复杂的条件分支判定,这时可以嵌套使用if语句来实现,如下:

  1. num = raw_input('Enter a number: ')
  2.  
  3. if name.endswith('Gumby'):
  4. if name.startswith('Mr.'):
  5. print 'Hello. Mr.Gumby'
  6. elif name.startswith('Mrs.'):
  7. print 'Hello, Mrs. Gumby'
  8. else:
  9. print 'Hello,Gumby'
  10. else:
  11. print 'Hello,Stranger'

3.6 更复杂的条件

比较运算符

比较运算符时条件中最基本的运算符,详见下表:

表达式 描述
x == y x等于y
x < y x小于y
x > y x大于y
x >= y x大于等于y
x <= y x小于等于y
x != y x不等于y
x is y x和y是同一个对象
x is not y x和y是不同的对象
x in y x是y容器(序列等)的成员
x not in y x不是y容器(序列等)的成员

同一性运算符

在Python中使用is运算符来进行同一性判断(即是否属于同一个对象),而相等性运算符(==)用来判断两个对象是否相等,区别如下代码所示:

  1. x = [1,2,3,4,5]
  2. y = [1,2,3,4,5]
  3.  
  4. print x == y # True
  5. print x is y # False
  6.  
  7. z = y
  8. print z is y # True

避免将is运算符用于比较不可变值(如:数值类型,字符串等)

成员资格运算符

使用in来判断某一元素是否属于容器中的成员。如下:

  1. book = 'Dive Into Python'
  2.  
  3. print 'P' in book # True

字符串和序列比较

字符串(字符是按照本身的顺序值排列的)可以按照字母排序进行比较,如:

  1. print 'alpha' < 'beta' # True

不过实际的排序结果和使用不同的locale而变化。

locale模块提供了C本地化(localization)函数的接口,同时提供相关函数,实现基于当前locale设置的数字,字符串转换(int/float/string模块中的转换函数不受locale设置的影响)。更多locale模块的信息,可以参考这里:http://docs.python.org/2/library/locale.html

序列之间也可以通过对比序列中的元素来进行比较:

  1. print [1,2] < [2,1] # True
  2. print [1,[2,3]] > [1,[2,4,5]] # False

布尔运算符

常用的布尔运算符有:

  • and(&&)
  • or(||)
  • not(!)

和在C#这些语言中不同,在Python中直接通过它们对应的单词使用,如:

  1. age = 12
  2.  
  3. if age > 6 and age <= 12:
  4. print 'schoolchild'
  5. else:
  6. print 'not schoolchild'

4. 断言

assert语句失败的时候,会引发一个AssertionError。 与其让程序在晚些时候崩溃,不如在错误条件出现时直接让它崩溃,在Python中我们可以通过使用assert语句来实现一个断言,assert语句失败的时候会抛出AssertionError异常。如下:

  1. # -- coding: utf-8 --
  2. mylist = ['item']
  3. assert len(mylist) >= 1
  4. mylist.pop()
  5. assert len(mylist) >= 1 '断言失败,程序终止运行'

5. 循环

while循环中的表达式如果为True就会一直执行其后的语句块,如下打印0-100的值:

  1. x = 0
  2. while x <= 100:
  3. print x
  4. x += 1

5.2 for循环

在Python中for循序的使用方法基本和C#中的foreach一样,使用for循环打印0-100的值:

  1. numbers = range(0,101)
  2. for num in numbers:
  3. print num

使用for循环遍历字典

  1. # -- coding: utf:8 --
  2. dic = {'a':1,'b':2,'c':3,'d':4,'e':5}
  3. for key in dic:
  4. print key, '对应',dic[key]
  5.  
  6. # 循环中使用序列解包
  7. for key,value in dic.items():
  8. print key, '对应',value

5.3 使用迭代工具

Python为了为了方便迭代序列提供了一些很好的工具函数。这些函数有Python内建的,但是大部分位于:itertools模块中,更多信息可以参考Python文档:http://docs.python.org/2/library/itertools.html

并行迭代

通过使用Python内建的zip函数可以将两个序列合并为一个元组:

  1. # -- coding: utf-8 --
  2. names = ['anne','beth','george','damon']
  3. ages = [12,45,32,102]
  4.  
  5. # 将两个序列“压缩”在一起,返回一个元组的列表
  6. poeples = zip(names,ages)
  7.  
  8. # 再循环中解包元组
  9. for name,age in poeples:
  10. print name, 'is', age, 'years old'

元组的长度等于相对较短序列的长度。如下:

  1. # output: [(0, 0), (1, 1), (2, 2)]
  2. print zip(range(3),xrange(100))

编号迭代

如果需要在迭代序列的同时还要获取当前迭代对象的索引,可以使用下面的方法:

  1. # -- coding: utf-8 --
  2.  
  3. strings = ['','','','','']
  4.  
  5. index = 0
  6. for string in strings:
  7. if '' in string:
  8. strings[index] = ''
  9. index += 1
  10. # output: ['1', '1', '1', '1', '1']
  11. print strings

或者是直接使用内建的ernumerate函数:

  1. # -- coding: utf-8 --
  2.  
  3. strings = ['','','','','']
  4.  
  5. for index,string in enumerate(strings):
  6. if '' in string:
  7. strings[index] = ''
  8. # output: ['1', '1', '1', '1', '1']
  9. print strings

翻转和排序迭代

reversedsorted这两个函数可以使用在任何序列或可迭代对象,返回的是翻转或者排序后的版本。如下:

  1. # -- coding: utf-8 --
  2.  
  3. # output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  4. print sorted([9,1,8,2,6,5,4,3,7,0])
  5.  
  6. # output: ['!', 'e', 'h', 'l', 'l', 'o']
  7. print sorted('hello!')
  8.  
  9. # reversed 返回的是一个可迭代对象
  10. # 通过list()函数将对象转换为列表
  11. # output: ['!', 'o', 'l', 'l', 'e', 'h']
  12. print list(reversed('hello!'))
  13.  
  14. # output: !olleh
  15. print ''.join(reversed('hello!'))

5.5 跳出循环

break: Python使用break语句跳出循环:

  1. # -- coding: utf-8 --
  2. import random
  3.  
  4. while True:
  5. # 生成0-9之间的随机数
  6. num = random.randrange(0,10)
  7. print num
  8. if num == 6:
  9. break

continue: continue语句会让当前的迭代结束,直接开始下一轮的循环,如下所示:

  1. # -- coding: utf-8 --
  2.  
  3. # 输出:6
  4. for num in xrange(1,10):
  5. if num == 1:continue
  6. if num == 2:continue
  7. if num == 3:continue
  8. if num == 4:continue
  9. if num == 5:continue
  10. print num
  11. break

6.列表推导式

列表推导式(list comprehension)是利用其它列表创建新列表的一种方法,如下:

  1. # -- coding: utf-8 --
  2.  
  3. # output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  4. # 列表元素x由其自身的平方根组成
  5. print [x*x for x in range(10)]

增加条件: 我们还可以为创建的元素添加其它条件,如下:

  1. # -- coding: utf-8 --
  2.  
  3. # output: [0, 10, 20, 30, 40, 50]
  4. # 列表元素x由其自身*2的倍数组成,且能被5整除
  5. print [x*2 for x in range(30) if x % 5 ==0]

多个for语句: 还可以通过使用多个for语句来生成列表:

  1. # -- coding: utf-8 --
  2.  
  3. # output: [(0, 0), (0, 1), (1, 0), (1, 1)]
  4. # 生成x和y的所有组合
  5. print [(x,y) for x in range(2) for y in range(2)]

下面的for循环部分创建的列表和上面的推导式一样:

  1. # -- coding: utf-8 --
  2.  
  3. result = []
  4. for x in range(2):
  5. for y in range(2):
  6. result.append((x,y))
  7. # output: [(0, 0), (0, 1), (1, 0), (1, 1)]
  8. print result

 

7. pass/del/exec 语句

pass语句——代码中的占位符pass语句在Python代码中充当占位符使用。比如说现在马上就要测试一个if语句,但是其中还缺少一个语句块(代码不会执行,Python中空代码块是非法的),这个时候我们可以暂时使用pass语句来填充,如下:

  1. # -- coding: utf-8 --
  2.  
  3. age = 12
  4. age = 5
  5. if age > 6 and age <= 12:
  6. print 'schoolchild'
  7. else:
  8. # 未完成
  9. pass

 

使用del语句删除

Python解释器通过垃圾回收可以将内存中没有任何引用的对象给清理掉。我们也可以通过del语句我们也可以直接将一个对象从内存中清除,如下:

  1. # -- coding: utf-8 --
  2.  
  3. x = ['hello','world']
  4.  
  5. del x
  6. # NameError: name 'x' is not defined
  7. print x

使用exec和eval执行和求值字符串

使用exec语句可以执行存储在字符串中的Python代码,如下:

  1. # output: hello,world
  2. exec "print 'hello,world'"

通过使用eval语句可以计算以字符串形式书写的Python表达式,我们可以在Python交互解释器中输入如下代码:

  1. >>> eval(raw_input("Enter an arithmetic expression: +"))
  2. Enter an arithmetic expression: +16+16
  3. 32
  4. >>>

我们在程序中输入了:16+16的表达式,通过eval执行后返值:32

为了提高程序的安全性,我们可以为exec语句和eval语句增加一点包装,将这些语句限制在特定的作用域中,如下:

  1. scope = {}
  2. exec 'sqrl = 6' in scope
  3. print scope['sqrl'] # output: 6
  4.  
  5. scope = {}
  6. scope['x'] = 2
  7. scope['y'] = 3
  8.  
  9. print eval('x * y',scope) # output: 6

警告

在Python中使用exec执行Python代码字符串和通过eval语句计算Python表达式,这样的做法并不推荐,因为这样会有潜在的严重漏洞。 因为可能会有用户提供一些恶意的字符串作为代码或表达式来执行,这样程序会有潜在失去控制的危险。记住:在python中并没有任何执行不可信任代码的安全方式。

参考资料&进一步阅读

Python基础教程(第二版)

简明Python教程

深入 Python :Dive Into Python 中文版

Python 维基百科

【循序渐进学Python】5.Python常用流程控制及其他语句的更多相关文章

  1. Python分支结构与流程控制

    Python分支结构与流程控制 分支结构 if 语句 分支结构在任何编程语言中都是至关重要的一环,它最主要的目的是让计算机拥有像人一样的思想,能在不同的情况下做出不同的应对方案,所以if语句不管是在什 ...

  2. Python第四天 流程控制 if else条件判断 for循环 while循环

    Python第四天   流程控制   if else条件判断   for循环 while循环 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Python第二天 ...

  3. python语法入门之流程控制

    python语法入门之流程控制 流程控制是指控制流程,具体指控制程序执行的流程. 流程控制分为三种: 1.顺序结构 程序从上而下的正常执行(正常执行的代码就是顺序结构) 2.分支结构 赋予程序人的思维 ...

  4. 运算符的应用及流程控制if,switch语句

    运算符的应用 1:赋值运算符    简单赋值运算符        例如var useName='tom';//简单赋值运算符    复合赋值运算符        a+=b;//相当于a=a+b;   ...

  5. Python基础之用户交互、流程控制、循环语句

    python的简洁性真的令人叹为观止,没有JAVA那种输入还要导个包,不学不知道,一学吓一跳啊! 我在学这些基础的时候,会把python和java.c做对比,这样更好的理解记忆! 用户交互(输入) i ...

  6. python 流程控制(条件语句)

    1,python流程控制单条件基本语句 2,python流程流程多条件控制语句 3,三元运算 1,python流程控制单条件基本语句 if 判断条件: 执行语句…… else: 执行语句…… 判断条件 ...

  7. 【Python】Java程序员学习Python(六)— 流程控制、异常处理

    和Java语言一样,Python也有基本的流程控制,简单了解下即可. 一.流程控制的元素 条件 条件就是布尔值或者布尔值的表达式,要么是True要么是False. 代码块 在Python中,代码块不是 ...

  8. Python之旅:流程控制

    流程控制之if...else 每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试. Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定 ...

  9. Python学习笔记 - day4 - 流程控制

    Python流程控制 Python中的流程控制主要包含两部分:条件判断和循环. Python的缩进和语法 为什么要在这里说缩进和语法,是因为将要学习的条件判断和分支将会涉及到多行代码,在java.c等 ...

随机推荐

  1. SSH在Jenkins中的使用

    我们今天在迁移Jenkins的时候又出现无法调用私钥来获取oschina的git代码和使用scp拷贝无法验证的问题.我发现主要的问题实际上是关于ssh的问题,因为git和scp都是通过ssh来实现与远 ...

  2. java项目中读取properties文件

    这里的配置文件都放在src下面, System.properties的内容 exceptionMapping=exceptionMapping.properties config=config.pro ...

  3. Android 5.0 Default SMS App以及运营商授权SMS App

    已同步更新至个人blog:http://dxjia.cn/2015/08/android-5-default-sms-app/ 题外话:博友们有没有好用的写博客客户端推荐啊,cnblogs推荐的win ...

  4. Java 部分排序算法

    . import java.io.*;import java.math.*;import java.util.*;public class Algr{ public static int array[ ...

  5. C#中控件数组的讨论

    VB用得习惯后,到C#中来觉得很奇怪,如此好的控件数组怎么不见了.“众所周知,控件数组最主要的两个优点:可以循环附值:可以响应同一个事件.从而大大简化了代码.引自http://wenku.baidu. ...

  6. 增大VM下linux的根目录空间

    增大VM下linux的根目录空间   用的太久,发现VM下的系统空间不足.简单的方法是,分一个新硬盘,挂载到根目录下.    下面是直接增大根目录下空间:  1. 增大vm下的磁盘大小, VM -&g ...

  7. Bulk Insert的用法 .

    /******* 导出到excel */EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:/temp1.xls -c -q -S&quo ...

  8. 实战:ajax带参数请求slim API

    restful api 支持get,post,put,delete等方法,那么jquery客户端怎么去实现呢?涉及到跨域又怎么办? 很多时候需要传递一个token(api_key) 去识别用户身份,获 ...

  9. centos 7 卸载 mariadb 的正确命令

    #列出所有被安装的rpm package rpm -qa | grep mariadb #卸载 rpm -e mariadb-libs-5.5.37-1.el7_0.x86_64 错误:依赖检测失败: ...

  10. oracle 查询当前库中所有表以及某表字段信息

    select utc.COLUMN_ID,utc.TABLE_NAME,utc.COLUMN_NAME,utc.DATA_TYPE||utc.DATA_LENGTH,utc.DATA_DEFAULT, ...