Python邏輯控制流
所謂邏輯控制流仔拟,就是控制程序的邏輯行為衫樊,一步一步的流向,可以使用流程圖來表現(xiàn)這種行為的流動利花】瞥蓿控制流一般分成正常控制流和異吵词拢控制流臀栈,正常就是一切按預期的方向發(fā)展,異常就是控制流的突變挠乳。
*基于python 3.6.2 tutorial整理
python邏輯控制
- 條件語句
- 循環(huán)語句
- 異橙ㄊ恚控制
- function(可重用邏輯語句的封裝)
if條件
if statement :
pass
elif stat:
pass
elif stat:
pass
else:
pass
循環(huán)
for i in <iterable object>:
pass
###
while stat:
pass
#range()方法,產(chǎn)生數(shù)字序列
range(from,to,step)
range(10) >> [0,1,2,3,4,5,6,7,8,9]
range(1,5) >> [1,2,3,4]
range(1,10,2)>>[1,3,5,7,9]
異乘铮控制
try:
#do something dangerous
except Exception as e:
# do something save
#<else>:
pass
#<finally>: always execute this block
pass
方法
- 方法定義
# via https://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions
def functionname(args):
pass
def func(a:str) #指定參數(shù)類型
- 方法參數(shù)
普通參數(shù)
def func(a,b):
pass
帶默認參數(shù)(也叫關鍵字參數(shù))盟蚣,調(diào)用時b可不傳
def func(a,b=10):
pass
可變參數(shù)--------
#a、b之后的參數(shù)由c接收卖怜,多個參數(shù)則c為list對象
def func(a,b,*c):
pass
# c接收多個dict形式的參數(shù)屎开,
def func(a,b,**c):
pass
# 可變參數(shù)應該是最后一個參數(shù),要么最后的是默認參數(shù)马靠。*args 和**args共存時奄抽,**在后面
def concat(*args, sep="/"):
# Unpacking Argument Lists
# 1.
list(range(3, 6)) # normal call with separate arguments
#[3, 4, 5]
args = [3, 6]
list(range(*args)) # call with arguments unpacked from a list
# 2.
def parrot(voltage, state='a stiff', action='voom')
#unpacking map obejct to args
d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
parrot(**d)
####################################
error example:
def func(a=10,b):
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
parrot() # invalid :required argument missing
parrot(voltage=5.0, 'dead') #invalid: non-keyword argument after a keyword argument
parrot(voltage=5.0) # valid
parrot(110, voltage=220) # invalid:duplicate value for the same argument
parrot(actor='John Cleese') # invalid:unknown keyword argument
- 參數(shù)傳遞
python的參數(shù)是對象傳遞,如果對象是不可變的(immutable)甩鳄,則傳遞的是字面量逞度,即為傳值;如果對象是可變的(mutable)妙啃,則傳遞的是引用第晰。
#for example
# mutable object => list object,immutable object str object
def modify(li: list, s: str):
s = "modify"
li[0] = "modify"
list0 = [1, 2, 3]
str0 = "howareu"
print(list0,str0) # [1, 2, 3] howareu
modify(list0, str0)
print(list0,str0) # ['modify', 2, 3] howareu
java中參數(shù)的傳遞,和python其實差不多,不可變的傳值茁瘦,可變的傳地址(地址值品抽,也是值),所以說java參數(shù)是傳值的甜熔。O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"這個value就是地址的value圆恤。
- 方法內(nèi)變量查找
方法內(nèi)定義的變量,叫局部變量腔稀,或者叫本地變量(local variable)盆昙,其分配存儲在local symbol table中。當在方法內(nèi)引用一個變量的時候焊虏,變量的查找路徑是:local symbol table --->global symbol table--->build-in names.
所以淡喜,如果在方法內(nèi)定義了一個和外部(方法外)名字一樣的變量,就會遮蔽外部變量诵闭,當然不會修改炼团,只是遮蔽,使得方法內(nèi)只能看到這個local變量疏尿。
- 變量的scope規(guī)則和namespace
namespace:a mapping from a name to object;是一種關系的映射瘟芝,類比文件的路徑,如果以一個文件為基準褥琐,則可以通過相對路徑和絕對路徑锌俱,去定位一個唯一的文件,這個路徑敌呈,就是一個namespace贸宏。和不同目錄下的同名文件之間沒有關聯(lián)類似,不同namespace的的變量磕洪,也是無關的吭练。
變量的scope,可以類比文件目錄的層次來理解褐鸥。namespace類比文件所在目錄的名字加上文件名线脚,scope則是這個文件的活動區(qū)域,作用空間叫榕,可見范圍浑侥。
如在主要一個多層次的目錄下:
/tmp/---
---dir01/
---a.py # namespace: /tmp/dir01/a.py | scope:/tmp/dir01/
---b.py # namespace: /tmp/dir01/b.py | scope:/tmp/dir01/
---diir02/
---a.py # namespace: /tmp/dir02/a.py | scope:/tmp/dir02/
---b.py # namespace: /tmp/dir02/a.py | scope:/tmp/dir02/
---a.py # namespace: /tmp/a.py | scope:/tmp/
---b.py # namespace: /tmp/a.py | scope:/tmp/
在一個目錄下,只能看到目錄里面的文件晰绎,這個可見范圍寓落,可以理解成scope。越在外層荞下,越能被更多的視野掃描到伶选。
而改變一個變量(文件)的scope史飞,就是移動這個文件,python提供了兩個statement仰税,來修改變量的scope构资。
- nonlocal <var>
- global <var>
* nonlocal:是把變量的作用域,綁定到外一層的scope中去陨簇,但不會是global吐绵;
* global:則是綁定到global全局scope中去,讓所有的人都能看到它的身影河绽。
- lambda表達式
lambda表達式可用來定義一個匿名函數(shù)己单。在python中有諸多限制,使用場景在于去代替只有一句語句的 function定義耙饰。不是很推薦使用纹笼。
func = lambda x: x + 1
print(func(1))
def make_incrementor(n):
return lambda x: x + n
f = make_incrementor(42)
f(0) # 42
The end.