重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務器等服務
一)列表解析表達式
公司主營業(yè)務:成都網(wǎng)站制作、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出晉寧免費做網(wǎng)站回饋大家。
定義: 它是通過對“序列”中的每一項運行一個表達式來創(chuàng)建一個新的列表的方法,每次一個,從左至右,其能夠在任何可迭代的對象上進行迭代。
語法: [ item for item in seq [if statement]] //可以用if語句對迭代結(jié)果進行篩選
舉例:
>>>a = [1,2,3,4,5]
>>>[i for i in a if i % 2 == 0]
>>>[2, 4]
二)生成器表達式
定義: 它是通過對“序列”中的每一項運行一個表達式來創(chuàng)建一個新的生成器對象,每次一個,從左至右,其能夠在任何可迭代的對象上進行運算。
語法: (item for item in seq [if statement]) //可以用if語句對運算結(jié)果進行篩選
舉例:
>>>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__()方法。
三)列表解析語法擴展運用:用來創(chuàng)建集合和字典
定義: 它是通過對“序列”中的每一項運行一個表達式來創(chuàng)建一個新的集合或字典,每次一個,從左至右,其能夠在任何可迭代的對象上進行運算。
舉例:
>>>{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唯一
四)創(chuàng)建字典的其他方法
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}
五)迭代器及常見迭代工具
可迭代的:指可用迭代工具依次取出值的對象,如字符串,列表,元組等,同時可用內(nèi)置函數(shù)iter()或者對象本身的__iter__()方法將該對象轉(zhuǎn)換成迭代器對象。
迭代器:指支持迭代工具的同時,還可以用內(nèi)置函數(shù)next()或?qū)ο蟊旧淼腳_next__()方法依次取出值的對象。
總之:迭代器一定是可迭代的,但可迭代的不一定是迭代器,如常見的字符串,列表等是可迭代的,但不是迭代器。(由于迭代器一定是可迭代的,因此迭代器也支持iter()和__iter__()函數(shù)及方法,只是iter(迭代器)就是迭代器本身。)
常見迭代工具:for, in, map, zip, 列表解析,sorted, enumerate, sum, any, max, min等。
map使用
語法: map(funcName, iterableObject)
>>> b = map(abs, [-1, 0, 1]) //返回map迭代器
注:map參數(shù)可以是多個序列,每個序列相應位置的值同時傳給運算函數(shù);如果序列成員個數(shù)不一致,則以最短序列為準。
zip使用
語法: zip(iterableObject, iterableObject, ...)
>>> c = zip('abc', [1,2,3], [4,5,6]) //返回zip迭代器
注:如果序列成員個數(shù)不一致,則以最短序列為準。
filter使用
用法與map類型,其返回filter迭代器(對可迭代對象的每一項進行函數(shù)運算,如果運算后結(jié)果為True,則該項作為filter迭代器中的一項)。
六)閉合函數(shù)(工廠函數(shù))
定義:一個能夠記住嵌套作用域(具有嵌套作用域的基礎(chǔ)或者說前提是,須有嵌套的函數(shù)定義)的變量值的函數(shù)。(注:Python函數(shù)能夠保存狀態(tài)信息的主要方法有三種:全局變量、閉合函數(shù)及默認參數(shù)。)
舉例:
def func1(y):
def func2(x)
return(x**y)
return(func2) //這里返回的是內(nèi)層函數(shù)名(內(nèi)層函數(shù)對象)
>>>f = func1(2) //y為2這個func1的本地變量值被保存,并將內(nèi)層函數(shù)對象賦值給變量f(即重命名func2為f)。
>>>f(3)===>9
>>>f(4)===>16
七)嵌套作用域與lambda匿名函數(shù)表達式
注:為什么將lambda匿名函數(shù)稱為lambda匿名函數(shù)表達式,是因為lambda會創(chuàng)建一個函數(shù)對象,并將該對象返回,使用者需要用一個變量來引用(“存儲”)該對象,所以稱為表達式。(與一般意義的def區(qū)別就在于,def創(chuàng)建函數(shù)對象,并會將該函數(shù)對象賦值給函數(shù)名。)
由于嵌套作用域的查找原則和工廠函數(shù)能保存記住嵌套作用域變量值的特性,lambda函數(shù)和def函數(shù)定義可自然而然地結(jié)合使用:
def func1(y):
action = (lambda x: x**y)
return(action)
>>>f=func1(2)
>>>f(3)===>9
>>>f(5)===>25
特別注意:如果lambda或者def嵌套在函數(shù)中定義,且其定義嵌套在一個循環(huán)之中并且嵌套的函數(shù)引用了一個上層作用域的變量,而該變量又被循環(huán)所改變,則所有在這個循環(huán)中產(chǎn)生的函數(shù)將會有相同的值——在最后一次循環(huán)中完成時被引用變量的值。
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
如果想得到下面結(jié)果:
>>>actions[0](2)===>0 //i隨循環(huán)遞增
>>>actions[4](2)===>16
則函數(shù)需做如下修改:
def makeActions():
acts=[]
for i in range(5):
acts.append(lambda x, i=i: i**x) //原理是:如果不添加i=i,則每次調(diào)用lambda函數(shù)時都是找父函數(shù)中的i,而父函數(shù)中的i在循環(huán)完成時已經(jīng)變?yōu)榱?;添加了i=i,則每次創(chuàng)建lambda函數(shù)時,相當于在lambda函數(shù)內(nèi)部創(chuàng)建了變量名為i的本地變量
return(acts)
八)__init__.py文件的使用
該文件主要有3大作用:
包的初始化:Python首次導入某個目錄或目錄下的目錄或文件時,系統(tǒng)會自動執(zhí)行該目錄下的__init__.py文件中的代碼,因此該文件通常存放一些初始化代碼及鉤子函數(shù)等;
給目錄虛擬化一個模塊對象,從而形成目錄(虛擬化目錄模塊)的命名空間。當使用"import 目錄"直接導入目錄時,系統(tǒng)會為目錄創(chuàng)建一個同名虛擬模塊命名空間,且該命名空間包含了目錄下__init__.py文件中所有賦值的變量名(注:僅包含__init__.py文件中定義或引入的,而不會包含該目錄下的子模塊或目錄)。
可在__init__.py文件中定義__all__列表自定義采用 “from 目錄 import *”方式導入目錄下變量的時候會導入哪些該目錄下的子模塊,如果不定義__all__列表,“from 目錄 import *”所導入的變量實質(zhì)是等同于"import 目錄"的,區(qū)別只是在于一個可直接訪問,或者需要以目錄.變量訪問。(注:__all__定義僅適用于from *模式導入(如果用import 目錄模式導入,__all__列表設(shè)置不起作用),且一旦定義了__all__列表且用from *模式導入,則__init__.py文件自身的變量不可被導入,除非也將其寫入__all__列表。)
九)_x及__all__設(shè)置隱藏模塊及目錄導入數(shù)據(jù)
_x是以單下劃線開始的變量定義(私有變量聲明),__all__是設(shè)置變量名列表,這2者均可設(shè)置在__init__.py文件和普通的模塊文件,其使用范圍也均僅限于from *模式導入方式。_x方式定義其不可被導入,而__all__定義其可被導入,兩者作用相反。
十)