Python编程高手之路——第二章:流程控制
二、流程控制
2.1 运算方式
计算机的核心部件是CPU,CPU有两个功能,控制和运算;
2.1.1 数学运算print(a ** b) # 幂 print(a // b) // 取整数 12 2.1.2 比较运算
print(a == b) print(a > b) print(a >= b) 123 2.1.3 赋值运算
a = b a %= b a **= b a //= b 1234 2.1.4 逻辑运算
print(True and False) # 与运算,True和False进行与运算,结构应该为False print(True or False) # 或运算,True和False进行或运算,结果应该为True print(not(True and False)) # 非运算,将结果置非,即True变False,False变True 123' 2.1.5 身份运算 is比较的是id,在python中,id为变量的内存地址,id相同意味着在内存中保存的地址也相同,即为同一个变量;==比较的是值;
2.2 分支语句
2.2.1 if,else对于逻辑运算,即根据外部条件的变化而做出不同的反映;
2.2.2 if循环嵌套使用age = 98 weight = 45 is_public_place = False # 只要在公共场合就不能吸烟 if is_public_place: print('任何人禁止吸烟') else: user_age = input('请输入年龄') user_age = int(user_age) if user_age >= 18: user_weight = input('请输入体重') user_weight = int(user_weight) if user_weight >= 50: print('可以吸烟') else: print('体重太轻了,建议不要吸烟') else: print('未成年人禁止吸烟')
1234567891011121314151617 2.2.3 if,elif,else使用使用模板:
if 条件1: 缩进的代码块: elif 条件2: 缩进的代码块: ...... else: 缩进的代码块 1234567
2.3 循环语句
2.3.1 while循环(条件循环)while 条件: #循环体; #如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件; #如果条件为假,那么循环体不执行,循环停止; 1234
注意:满足条件就是指条件为真,一般会用True直接表示条件为真,如果表示条件为假可以这样表示:False None 0 “” () [] {};
注意,字符串" "里面有空格,表示为True而不是False;
2.3.2 for循环(1)for循环(迭代循环)
for循环是迭代式循环,for循环遍历被循环中的每一项内容,比如下面的代码,for会循环遍历range(10)中的每一个元素,即0,1,2,3,4,5,6,7,8,9,语法如下:
for i in range(10): 缩进的代码块 123
说明:
其中i为迭代出来的一个个对象,i只是一个变量名,可以任意定义;关键字for和in是必须的;range(10)是一个被迭代的对象,只要能存多个值,就可以被迭代,直接写一个列表也是一样的;迭代循环可以理解为被迭代的对象就是一个老母鸡,她肚子里有的是蛋,迭代出来的对象就是蛋;sum_value = 0 # 将和的初值置0 for i in range(10): sum_value += i print(sum_value) 1234'
(2)break与continue
(3)for循环与else连用
dir = {1:'kobe',2:'LBJ',3:'CP3',4:'TDK'} # 字典格式,1 2 3 4为键, Kobe LBJ等为键对应的值 for k,v in dir.items(): print(k,v) else: print('ending') """ #输出 1 Kobe 2 LBJ 3 CP3 4 TDK ending """ 1234567891011121314'
2.4 流程控制语句用法说明
2.4.1 避免多层分支嵌套要竭尽所能的避免分支嵌套,过深的分支嵌套是很多编程新手最容易犯的错误之一。假如有一位新手程序员写了很多层分支嵌套,那么可能会看到一层又一层的大括号:
if: if: if: ... else: else: else: 1234567
俗称“嵌套if地狱(Nested If Statement Hell)”,如果能够避免的话,尽可能用其它的方式代替,例如函数,这种多层嵌套不利于代码的可读性,尤其是当一个if分支下代码的量比较多的时候。
2.4.2 封装那些过于复杂的逻辑如果条件分支里的表达式过于复杂,出现了太多的not/and/or,那么这段代码的可读性就会大打折扣,这时候可以把它拆解,或者先用not的形式取反,取反的意义即为原来值为True,not后为False,原来值为False,not后为True。
2.4.3 留意不同分支下的重复代码重复代码是代码质量的天敌,而条件分支又非常容易成为重复代码的天敌。所以,当编写条件分支语句时,需要特别留意,不要生产不必要的重复代码。当编写分支代码时,请额外关注由分支产生的重复代码块,如果可以简单的消灭他们,那就不要迟疑。
2.4.4 使用“德摩根定律”再做分支判断时,有时候会写成这样的代码:
# 如果用户账号没有余额或者用户透支额度,拒绝用户购买 # 以下是伪代码 if not "用户登录" or not "有透支额度" print("拒绝用户购买") 1234
第一眼看到代码时,是不是需要思考一会才能理解它想干嘛?这是因为上面的逻辑表达式里面出现了2个not和1个or,而我们人类恰好不擅长处理过多的“否定”以及“或”这种逻辑关系。这种时候,就该摩尔根定律出场了。通俗的说,摩尔根定律就是not A or not B等价于not (A and B)。通过转换,上面的代码可以改写成这样:
if not("用户登录" and "有透支额度") 1 2.4.5 在条件判断中使用all() / any()
all()和any()两个函数非常适合在条件判断中使用。这两个函数接受一个可迭代对象,返回一个布尔值,其中:
all(seq):仅当seq中所有对象都为布尔真时返回True,否则返回False;any(seq):只要seq中任何一个对象为布尔真就返回True,否则返回False;假如有下面这段代码:
def all_number_gt_10(numbers): # 仅当序列中所有数字大于10时,返回True if not numbers: # 如果numbers为空,因为在这里numbers代表一个列表,[1, 2, 3...]这种格式 return False for n in numbers: # 遍历numbers中的每一个元素 if n <= 10: return False # 如果有元素小于等于10,该函数马上返回False return True # 如果numbers列表中的所有元素都大于10,那么返回True 12345678'
如果使用all()建函数,再配合一个简单的生成器表达式,上面的代码可以写成这样:
def all_numbers_gt_10_2(numbers): return bool(numbers) and all(n > 10 for n in numbers) 12' 2.4.6 使用try/while/for中else分支
看一下这个函数:
def do_stuff(): first_thing_successed = False try: do_the_first_thing() # 做第一件事 first_thing_successed = True # 第一件事成功了,把标志位置为True except Exception as e: # 如果上面两行代码(try中的两行代码)有错误,第一件事没有成功,执行下面语句 print("Error while calling do_some_thing") return # 仅当first_thing成功完成时,做第二件事 if first_thing_successed: return do_the_second_thing() 1234567891011'
在函数do_stuff中,我们希望只有当do_the_first_thing()成功调用后(也就是不抛出任何异常),才继续做第二个函数调用,为了做到这一点,我们需要定义一个额外的变量first_thing_successed来作为标记。其实,可以用更简单的方法达到同样的效果:
def do_stuff(): try: do_the_first_thing() except Exception as e: print("Error while calling do_some_thing") return else: return do_the_second_thing() 12345678'
在try语句块最后追加上else分支后,分支下的do_the_second_thing()便只会在try下面的所有语句正常执行(也就是没有异常,没有return、break等)完成后执行。类似的,python里的for/while循环也支持添加else分支,它们表示:当循环使用的迭代对象被正常耗尽、或while循环使用的条件变量变为False后才执行else分支下的代码。
2.4.7 与None值的比较在python中,有两种比较变量的办法·:==和is,两者在含义上有着根本的区别:
==:表示二者所指向的值是否一致is:表示二者是否指向内存中的同一份内容,也就是id(x)是否等于id(y)None在python语言中是一个单例对象,如果要判断某个变量是否为None时,记得使用is而不是==,因为只有is才能在严格意义上表示某个变量是否为None。
否则可能出现下面这种情况:
class Foo(object): def __eq__(self, other): # 魔法方法,当该类在==判断中做左值时触发 return True foo = Foo() print(foo) print(foo = None) print(foo is None) 12345678
在上面代码中,Foo这个类通过自定义__eq__魔法方法的方式,很容易就满足了==None这个条件。所以要判断某个变量是否为None时,请使用is而不是 ==。
2.4.8 留意and和or的运算优先级看看下面两个表达式,猜猜他们的值是否一样?
(True or False) and False
True or False and False
答案是:不一样,它们的值分别是False和True。问题的关键在于:and运算符的优先级大于or。因此上面的第二个表达式在python看来实际上是True or (False and False)。所以结果是True而不是False。在编写包含多个and和or的表达式时,请额外注意and和or的运算优先级。即使执行优先级正好是你需要的那样,也可以加上额外的括号来让代码更清晰。
相关知识
Python画花的代码:编程与艺术的交融
python玫瑰花代码简单
玫瑰花的python程序代码
python玫瑰花代码讲解
李涛《数码摄影后期高手之路》高清下载
Python编程实现花卉图案绘制与色彩搭配技巧详解
【Mind+】图形化编程系列教程大全 持续更新 DF创客社区
通向摄影高手之路?如何拍好各种花卉
(开题)flask框架《花间故里》(程序+论文+python)
【雕爷学编程】MicroPython手册之 ESP32
网址: Python编程高手之路——第二章:流程控制 https://www.huajiangbk.com/newsview732526.html
上一篇: JSP中日文乱码问题的解决 |
下一篇: 乒乓菊花语解读——传递坚强与希望 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039