日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python语言有哪两个系列_(转)Python学习笔记系列——Python是一种纯粹的语言

發(fā)布時間:2023/12/15 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python语言有哪两个系列_(转)Python学习笔记系列——Python是一种纯粹的语言 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在摸索適合自己的語言學(xué)習(xí)方法,看到一篇好文章,轉(zhuǎn)之,侵刪。

Python的語法范式相當(dāng)多、知識點相當(dāng)細,但是Python是一種內(nèi)在一致性很好的語言,理解了幾條基本的規(guī)則,就很容易理解大部分語法與現(xiàn)象。本文會總結(jié)一下Python中最根本的幾條規(guī)則,從這幾條規(guī)則中,我們可以看出Python與許多其他語言不同,它是非常純粹、非常和諧的。

Python的基本語法:表達式運算與名稱綁定

Python的語句大體上可以分成簡單語句和復(fù)合語句兩類,簡單語句當(dāng)中,最重要的是表達式語句和賦值語句。為了區(qū)分C/C++等其他語言當(dāng)中的賦值,本文中,我們將

a = 1b= 'abc'c= (a,b)

這樣的賦值語句稱為名稱綁定。顧名思義,它代表將右側(cè)表達式運算的結(jié)果起了個名字,方便我們將來使用。相應(yīng)的,變量在本文中稱為名稱,它主要代表名字本身,而不是對應(yīng)的值。在官方文檔當(dāng)中叫做identifier(標(biāo)識符),綁定也就是bound。

關(guān)于表達式、簡單語句、復(fù)合語句的分類,在官方文檔 https://docs.python.org/2.7/reference/index.html 當(dāng)中已經(jīng)講得非常好而全面了(用Python 3的注意左上角切換版本)。簡單來說,表達式有很多種,比如常量,比如單個名稱,比如運算,比如調(diào)用,比如yield等等,這個列表也會不斷擴展。表達式的共同特點是它們都有且僅有一個返回值——有些返回值永遠是None,有些返回值是元組,但可以認為都是有且僅有一個返回值。

有些時候我們直接計算表達式就夠了,比如有些函數(shù)調(diào)用。另一些時候,我們會關(guān)心這個表達式求出的值,我們希望在后面重新使用這個計算出的值,我們就用到了名稱綁定,也就是為這個結(jié)果起一個方便我們后面使用的名字,通過名稱綁定,它是非常淺顯易懂的語法,通常由一個等號組成,等號左側(cè)是要賦值的名稱,右側(cè)是表達式,表達式的結(jié)果就會綁定到這個名稱上:

=

這種包含等號的語句叫做賦值語句,它還有另外幾種變種:

, =

#如:

a,b = (1,2)#或者

a,b = 1,2

表示解構(gòu)的賦值

= = = ... =

可以將同一個值綁定到多個名稱。

賦值語句和名稱綁定略有區(qū)別,它除了用于名稱綁定以外,還可以用來修改可變對象如列表(list)和字典(dict):

a[1] = 2a[2:3] = [4,5,6]

b['a'] = 12

通常需要注意區(qū)別。

Python綁定 vs C賦值

我們看下面的代碼:

a = 1a= "abc"

當(dāng)我們對已經(jīng)綁定了的名稱重新賦值的時候,舊的值會解除綁定,新的值綁定到名稱,這對于舊的值和新的值來說都是不可見的。名稱相當(dāng)于相應(yīng)值的別名,這個值有多少個名稱,都不會影響到值本身;同樣,不同的名稱也都代表同一個值,因此如果多個名稱綁定到了同一個值,而值發(fā)生了變化,所有名稱對應(yīng)的值都會變化:

a = [1,2]

b=a

a.append(3)

a#[1,2,3]

b #[1,2,3]

以往會用“傳值/傳引用”、“強類型/弱類型”這樣的概念,對于Python來說其實都是不必要的,我們記住這樣的規(guī)則:名稱只是對象的別名,不同的名稱可以表示同一個對象,同一個對象并沒有唯一的名稱。

C中的變量就完全不一樣,一旦定義就占用固定的內(nèi)存,賦值實際上是實際內(nèi)存值的復(fù)制。Python的名稱是個邏輯概念,而C的變量相當(dāng)貼近物理實現(xiàn),這也體現(xiàn)了Python作為編程語言更為純粹這一特點。

除了重新綁定時候自動解除舊值的綁定,Python中的名稱還可以強制解除綁定:

del

特殊綁定

除了賦值語句以外,還有一些特殊語句會實現(xiàn)名稱綁定,主要包括import、def(函數(shù)定義)、class(類定義)。此外,某些語句的主要功能不是名稱綁定,但可以額外附加名稱綁定的效果,如for、except、with。

重點說前三個,它們實際上都是賦值語句的直接變形,如import:

importmy_moduleimportmy_module as m1from my_module importmy_objectfrom my_module import my_object as o1

實際上完全等效于:

my_module = __import__('my_module')

m1= __import__('my_module')

_= __import__('my_module')

my_object=_.my_objectdel_

_= __import__('my_module')

o1=_.my_objectdel _

這些語句只是將表達式求值 + 賦值的過程寫成了比較統(tǒng)一、簡潔、易懂的形式,要理解它們本質(zhì)上仍然是賦值語句。因此import的結(jié)果也可以用del解除綁定,可以重新綁定到新的值。這體現(xiàn)了Python語言的一致性。

定義函數(shù)和類也是這樣:

defmy_func():pass

#重新綁定

my_func = 123

#解除綁定

del my_func

這與C/C++區(qū)別很大,它們都是在定義的時候創(chuàng)建了函數(shù)/類的對象,然后將這個對象綁定到了相應(yīng)的名稱上,理解這一點對于理解嵌套函數(shù)定義之類的規(guī)則大有幫助。

作用域,作用域嵌套與global作用域

在函數(shù)中,名稱可以獨立進行重新綁定,而不影響外部綁定的效果,這種特性叫做名稱作用域:

a = 1

deffunc():

a= 2

returna

func()#2

a #1

每個函數(shù)都有自己獨立的作用域,但與C/C++不同,復(fù)合語句沒有自己獨立的作用域。函數(shù)中可以嵌套定義其他函數(shù),這些函數(shù)也有自己的作用域:

a = 1

deffunc1():

a= 2

deffunc2():

a= 3

returnareturn(a, func2())

func1()#(2,3)

a #1

最外層的作用域叫做global作用域,對于一個最外層的函數(shù)來說,這是這個函數(shù)定義的模塊。

名稱可以同時存在在多個不同的作用域中,在Python的函數(shù)中使用名稱時,名稱解析到具體哪一個作用域,服從下面的規(guī)則:

一旦這個函數(shù)中存在對某個名稱的綁定,則在這個函數(shù)中,名稱會解析到本函數(shù)的作用域

否則,依次考慮更高一層的作用域,直到這個名稱會被解析到這個作用域(或者說,在這一級作用域中,存在對這個名稱的綁定) ,或者到達global作用域為止。

“存在對某個名稱的綁定”,包括賦值語句,也包括之前提到的特殊綁定,以及之后會提到的參數(shù)綁定。注意只要存在這樣的綁定的語句,哪怕這個語句從未執(zhí)行,也會導(dǎo)致作用域解析的變化,換句話來說,名稱解析到哪個作用域,是函數(shù)定義的時候就決定了的:

a = 2

deffunc():ifFalse:

a= 1

return a #UnboundLocalError

然而,具體的解析到值的過程,則是在語句運行時才進行的,這個需要著重注意:

deffunc():

a= 1

deffunc2():returna

a= 2

returnfunc2()

func()#2

初學(xué)者經(jīng)常犯的錯誤就是這樣的:

defmultipliers(n):

funcs=[]for i inrange(0,n):def_func(b):return i *b

funcs.append(_func)returnfuncs

ms= multipliers(10)

ms[2](3) #27, 9 * 3

正確理解了其中的原理之后,這個現(xiàn)象就一點也不難理解了:i在運行時才解析,而運行時,循環(huán)已經(jīng)結(jié)束了,所以i是9

每個函數(shù)都有自己的global作用域,它是函數(shù)定義的Python文件(或者說模塊)。它實際上是模塊命名空間與__builtins__命名空間兩層,其中__builtins__對所有的模塊都生效。

參數(shù)綁定

對于函數(shù)來說,函數(shù)的參數(shù)的綁定是比較特殊的一個過程,它在調(diào)用的時候進行綁定,但是是將傳入的參數(shù)值,在函數(shù)自己的作用域中,綁定到參數(shù)名稱:

a = 1

deffunc(a):returna

func(2) #2

a #1

它服從一切名稱綁定的作用域規(guī)則,可以重新綁定,可以del,可以被子作用域解析。

參數(shù)可以有默認值,有默認值的情況下,可以理解為實際的參數(shù)綁定之前,預(yù)先將這些名稱綁定到了對應(yīng)的值,如果調(diào)用時指定了新值則重新綁定到新值。

如果既沒有默認值、也沒有在調(diào)用時綁定,就會發(fā)生名稱未綁定的錯誤。

小結(jié)

Python可以運行表達式,也可以將表達式的值綁定到某個名稱

綁定的形式有普通綁定,特殊綁定,參數(shù)綁定

綁定與作用域的規(guī)則:

默認綁定到當(dāng)前作用域

解析名稱時,會解析到最近一層綁定該名稱的作用域

global/nonlocal可以修改這個特性

定義時決定解析到哪個作用域;運行時決定解析的值

前面這么多內(nèi)容,整理成規(guī)則卻非常簡潔,有沒有感受到Python的確是很協(xié)調(diào)、很純粹的語言呢?

后記

本文是從面向初學(xué)者的一個演示文稿中整理而來,這是前一部分,后一部分講面向?qū)ο蟆Q菔疚母瀹?dāng)中的一部分更基礎(chǔ)的內(nèi)容,考慮到受眾原因沒有在這篇文章中提到。

理解Python的規(guī)則的另一種方法是了解對象的內(nèi)部構(gòu)造,比如code對象內(nèi)部有哪些成員,cellvars和freevars各代表什么,__closure__屬性以及實現(xiàn),對象的__dict__與屬性的關(guān)系,等等,有一定編程基礎(chǔ)的也推薦這種學(xué)習(xí)方式。

總結(jié)

以上是生活随笔為你收集整理的python语言有哪两个系列_(转)Python学习笔记系列——Python是一种纯粹的语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。