【循序渐进学Python】5.Python常用流程控制及其他语句

简介:

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)可以将一个值同时赋给多个变量,如下:

x = y = z = 1

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

 

字符串和序列比较

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

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 = ['2','1','2','2','1']
 4 
 5 index = 0
 6 for string in strings:
 7     if '2' in string:
 8         strings[index] = '1'
 9     index += 1
10 # output: ['1', '1', '1', '1', '1']
11 print strings
复制代码

 

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

复制代码
1 # -- coding: utf-8 --
2 
3 strings = ['2','1','2','2','1']
4 
5 for index,string in enumerate(strings):
6     if '2' in string:
7         strings[index] = '1'
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交互解释器中输入如下代码:

>>> eval(raw_input("Enter an arithmetic expression: +")) 
Enter an arithmetic expression: +16+16 
32 
>>>

我们在程序中输入了: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 中文版

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/p/3386667.html,如需转载请自行联系原作者

相关文章
|
4月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
本文介绍了Python中的循环语句,包括while和for循环的使用,range()函数的运用,以及continue、break和pass关键字的说明,同时提出了关于while循环是否能与成员运算符结合使用的思考。
53 1
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
|
4月前
|
测试技术 索引 Python
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
本文提供了Python接口自动化测试中的编程练习,包括计算器、猜数字、猜拳和九九乘法表等经典问题,涵盖了数据类型、运算、循环、条件控制等基础知识的综合应用。
48 1
|
2月前
|
人工智能 IDE 测试技术
使用通义灵码提升Python开发效率:从熟悉代码到实现需求的全流程体验
作为一名Python开发者,我最近开始使用通义灵码作为开发辅助工具。它显著提高了我的工作效率,特别是在理解和修改复杂代码逻辑方面。通过AI编码助手,我能够在短时间内快速上手新项目,实现新需求,并进行代码优化,整体效率提升了60%以上。通义灵码不仅加快了代码生成速度,还增强了代码的健壮性和稳定性。
|
2月前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【10月更文挑战第4天】在Web开发中,数据库操作至关重要,但直接编写SQL语句既繁琐又易错。对象关系映射(ORM)技术应运而生,让开发者以面向对象的方式操作数据库,显著提升了开发效率和代码可维护性。本文探讨Python ORM的优势及其实现细节,并通过Django ORM的示例展示其应用。ORM提供高级抽象层,简化数据库操作,提高代码可读性,并支持多种数据库后端,防止SQL注入。Django内置强大的ORM系统,通过定义模型、生成数据库表、插入和查询数据等步骤,展示了如何利用ORM简化复杂的数据库操作。
61 6
|
4月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之if条件控制
Python中的流程控制语句if条件控制,涵盖了比较运算符、成员运算符、身份运算符、逻辑运算符的使用,if语句的嵌套,以及如何使用input和print函数进行交互式编程练习。
32 1
Python接口自动化测试框架(基础篇)-- 流程控制之if条件控制
|
3月前
|
SQL 关系型数据库 MySQL
Python操作pymysql数据库的流程与技巧
在现代软件开发中,Python作为一门高效且易于学习的编程语言,广泛应用于各种场景,其中包括数据库操作。**PyMySQL** 是一个流行的Python数据库接口,用于连接和操作MySQL数据库。它提供了一种简便的方法来执行SQL语句、处理数据和管理数据库事务。以下是使用PyMySQL操作MySQL数据库的流程与技巧,旨在为开发者提供一个清晰、实用的指南。
59 0
|
4月前
|
存储 测试技术 数据格式
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(二)
本文通过数据类型转换和文件读取的练习,复习了Python中的数据类型、循环、条件判断、内置函数等基础知识,并演示了如何将字符串数据转换为字典列表,以及如何从文本文件中读取和转换数据。
40 1
|
4月前
|
机器学习/深度学习 Ubuntu 数据挖掘
Ubuntu系统部署Anaconda环境及Python语言的详细流程
以上就是在Ubuntu系统中安装Anaconda环境及Python语言的详细流程。Anaconda为Python科学计算提供了便捷的管理方式,帮助用户轻松处理不同项目之间依赖管理的复杂性。通过以上步骤,你现在应该有了一个完全可用的Anaconda环境,可以开始在Ubuntu上进行Python编程和数据科学项目的探索了。
112 5
|
4月前
|
Python
python学习笔记---流程控制
这篇文章详细介绍了Python中的流程控制,包括选择结构(if、if-else语句、嵌套if语句)和循环语句(while循环、for循环以及for循环与range()函数的使用),以及如何在循环中使用break和continue语句。
python学习笔记---流程控制
|
4月前
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
133 0