01.Python逻辑控制流

Python逻辑控制流

所谓逻辑控制流,就是控制程序的逻辑行为,一步一步的流向,可以使用流程图来表现这种行为的流动。控制流一般分成正常控制流和异常控制流,正常就是一切按预期的方向发展,异常就是控制流的突变。

*基于python 3.6.2 tutorial整理

python逻辑控制

  • 条件语句
  • 循环语句
  • 异常控制
  • function(可重用逻辑语句的封装)

if条件

if statement :
    pass
elif stat:
    pass
elif stat:
    pass
else:
    pass

循环

for i in <iterable object>:
    pass
###
while stat:
    pass
#range()方法,产生数字序列
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) #指定参数类型
  • 方法参数
普通参数
    def func(a,b):
        pass
带默认参数(也叫关键字参数),调用时b可不传
    def func(a,b=10):
        pass

可变参数--------

#a、b之后的参数由c接收,多个参数则c为list对象
    def func(a,b,*c):
        pass
# c接收多个dict形式的参数,
    def func(a,b,**c):
        pass
# 可变参数应该是最后一个参数,要么最后的是默认参数。*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
  • 参数传递

python的参数是对象传递,如果对象是不可变的(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中参数的传递,和python其实差不多,不可变的传值,可变的传地址(地址值,也是值),所以说java参数是传值的。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。

  • 方法内变量查找

方法内定义的变量,叫局部变量,或者叫本地变量(local variable),其分配存储在local symbol table中。当在方法内引用一个变量的时候,变量的查找路径是:local symbol table --->global symbol table--->build-in names.

所以,如果在方法内定义了一个和外部(方法外)名字一样的变量,就会遮蔽外部变量,当然不会修改,只是遮蔽,使得方法内只能看到这个local变量。

  • 变量的scope规则和namespace

namespace:a mapping from a name to object;是一种关系的映射,类比文件的路径,如果以一个文件为基准,则可以通过相对路径和绝对路径,去定位一个唯一的文件,这个路径,就是一个namespace。和不同目录下的同名文件之间没有关联类似,不同namespace的的变量,也是无关的。

变量的scope,可以类比文件目录的层次来理解。namespace类比文件所在目录的名字加上文件名,scope则是这个文件的活动区域,作用空间,可见范围。

如在主要一个多层次的目录下:

/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。

  1. nonlocal <var>
  2. global <var>
 * nonlocal:是把变量的作用域,绑定到外一层的scope中去,但不会是global;
 * global:则是绑定到global全局scope中去,让所有的人都能看到它的身影。
  • lambda表达式

lambda表达式可用来定义一个匿名函数。在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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容