Python語言高級語法

一)列表解析表達式

定義: 它是通過對“序列”中的每一項運行一個表達式來創建一個新的列表的方法,每次一個,從左至右,其能夠在任何可迭代的對象上進行迭代。

語法: [ item for item in seq [if statement]]   //可以用if語句對迭代結果進行篩選

舉例:

>>>a = [1,2,3,4,5]

>>>[i for i in a if i  % 2 == 0]

>>>[2, 4]


二)生成器表達式

定義: 它是通過對“序列”中的每一項運行一個表達式來創建一個新的生成器對象,每次一個,從左至右,其能夠在任何可迭代的對象上進行運算。

語法: (item for item in seq [if statement])   //可以用if語句對運算結果進行篩選

舉例:

>>>a = [[1,2,3],[4,5,6],[7,8,9]]

>>>(sum(i) for i in a if i  % 5 == 0]

>>>[15]

>>>[i for i in (sum(row) for row in a)]

>>>[6,15,24]

注:生成器是迭代器的一種,迭代器支持next(iterator)方法和iterator.__next__()方法。


三)列表解析語法擴展運用:用來創建集合和字典

定義: 它是通過對“序列”中的每一項運行一個表達式來創建一個新的集合或字典,每次一個,從左至右,其能夠在任何可迭代的對象上進行運算。

舉例:

>>>{ord(x) for x in 'spaam'}

>>>{112, 97, 115, 109}  //集合會自動去重

>>>{x:ord(x) for x in 'spaam'}

>>>{'a':97,'p':112,'s':115,'m':109}  //字典的key唯一


四)創建字典的其他方法

1.

>>>dict(name='liyu', age=31)

>>>{'name':'liyu','age':31}

2.

>>>dict(zip(keyList, valueList))

3.

>>>dict.fromkeys(sequence, defaultValue)

>>>dict.fromkeys('ab',0)

>>>{'a':0,'b':0}


五)迭代器及常見迭代工具

可迭代的:指可用迭代工具依次取出值的對象,如字符串,列表,元組等,同時可用內置函數iter()或者對象本身的__iter__()方法將該對象轉換成迭代器對象。

迭代器:指支持迭代工具的同時,還可以用內置函數next()或對象本身的__next__()方法依次取出值的對象。

總之:迭代器一定是可迭代的,但可迭代的不一定是迭代器,如常見的字符串,列表等是可迭代的,但不是迭代器。(由於迭代器一定是可迭代的,因此迭代器也支持iter()和__iter__()函數及方法,只是iter(迭代器)就是迭代器本身。)

常見迭代工具:for, in, map, zip, 列表解析,sorted, enumerate, sum, any, max, min等。

  1. map使用

    語法: map(funcName, iterableObject)

    >>> b = map(abs, [-1, 0, 1])        //返回map迭代器

    注:map參數可以是多個序列,每個序列相應位置的值同時傳給運算函數;如果序列成員個數不一致,則以最短序列爲準。

  2. zip使用

    語法: zip(iterableObject, iterableObject, ...)

    >>> c = zip('abc', [1,2,3], [4,5,6])      //返回zip迭代器

    注:如果序列成員個數不一致,則以最短序列爲準。

  3. filter使用

        用法與map類型,其返回filter迭代器(對可迭代對象的每一項進行函數運算,如果運算後結果爲True,則該項作爲filter迭代器中的一項)。


六)閉合函數(工廠函數)

定義:一個能夠記住嵌套作用域(具有嵌套作用域的基礎或者說前提是,須有嵌套的函數定義)的變量值的函數。(注:Python函數能夠保存狀態信息的主要方法有三種:全局變量、閉合函數及默認參數。)

舉例:

def func1(y):

    def func2(x)

        return(x**y)

    return(func2)        //這裏返回的是內層函數名(內層函數對象)

>>>f = func1(2)        //y爲2這個func1的本地變量值被保存,並將內層函數對象賦值給變量f(即重命名func2爲f)。

>>>f(3)===>9

>>>f(4)===>16


七)嵌套作用域與lambda匿名函數表達式

注:爲什麼將lambda匿名函數稱爲lambda匿名函數表達式,是因爲lambda會創建一個函數對象,並將該對象返回,使用者需要用一個變量來引用(“存儲”)該對象,所以稱爲表達式。(與一般意義的def區別就在於,def創建函數對象,並會將該函數對象賦值給函數名。)

由於嵌套作用域的查找原則和工廠函數能保存記住嵌套作用域變量值的特性,lambda函數和def函數定義可自然而然地結合使用:

def func1(y):

    action = (lambda x: x**y)

    return(action)

>>>f=func1(2)

>>>f(3)===>9

>>>f(5)===>25


特別注意:如果lambda或者def嵌套在函數中定義,且其定義嵌套在一個循環之中並且嵌套的函數引用了一個上層作用域的變量,而該變量又被循環所改變,則所有在這個循環中產生的函數將會有相同的值——在最後一次循環中完成時被引用變量的值。

def makeActions():

    acts=[]

    for i in range(5):

        acts.append(lambda x: i**x)

    return(acts)

actions=makeActions()

>>>actions[0](2)===>16        //i始終使用的是4

>>>actions[4](2)===>16


如果想得到下面結果:

>>>actions[0](2)===>0        //i隨循環遞增

>>>actions[4](2)===>16


則函數需做如下修改:

def makeActions():

    acts=[]

    for i in range(5):

        acts.append(lambda x, i=i: i**x)        //原理是:如果不添加i=i,則每次調用lambda函數時都是找父函數中的i,而父函數中的i在循環完成時已經變爲了4;添加了i=i,則每次創建lambda函數時,相當於在lambda函數內部創建了變量名爲i的本地變量

    return(acts)


八)__init__.py文件的使用

該文件主要有3大作用:

  1. 包的初始化:Python首次導入某個目錄或目錄下的目錄或文件時,系統會自動執行該目錄下的__init__.py文件中的代碼,因此該文件通常存放一些初始化代碼及鉤子函數等;

  2. 給目錄虛擬化一個模塊對象,從而形成目錄(虛擬化目錄模塊)的命名空間。當使用"import 目錄"直接導入目錄時,系統會爲目錄創建一個同名虛擬模塊命名空間,且該命名空間包含了目錄下__init__.py文件中所有賦值的變量名(注:僅包含__init__.py文件中定義或引入的,而不會包含該目錄下的子模塊或目錄)。 

  3. 可在__init__.py文件中定義__all__列表自定義採用 “from 目錄 import *”方式導入目錄下變量的時候會導入哪些該目錄下的子模塊,如果不定義__all__列表,“from 目錄 import *”所導入的變量實質是等同於"import 目錄"的,區別只是在於一個可直接訪問,或者需要以目錄.變量訪問。(注:__all__定義僅適用於from *模式導入(如果用import 目錄模式導入,__all__列表設置不起作用),且一旦定義了__all__列表且用from *模式導入,則__init__.py文件自身的變量不可被導入,除非也將其寫入__all__列表。


九)_x及__all__設置隱藏模塊及目錄導入數據

_x是以單下劃線開始的變量定義(私有變量聲明),__all__是設置變量名列表,這2者均可設置在__init__.py文件和普通的模塊文件,其使用範圍也均僅限於from *模式導入方式。_x方式定義其不可被導入,而__all__定義其可被導入,兩者作用相反。


十)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章