python的語言特性

本文是在閱讀裘宗燕老師的《程序員學python》後對python中與C、java等語言不同的地方的總結。

 

第一章    python基礎

1.算數運算符://整除    /除    **乘冪

2.複數的虛部加後綴j或J,如(1+2j)

3.python能處理任意大的整數

4.底數前的正負號在乘冪之後作用,其他情況下正負號先作用,如下

5.一行的最後字符是反斜線\,這時解釋器把下一行作爲本行的繼續,這種反斜線稱爲續行符。

6.函數abs求絕對值;max、min求實參中的最大值和最小值,允許有多個實參;round求浮點數的近似值,可以增加一個整數說明保留的小數位數。如下:

7.導入語句有import有幾種形式:

(1)from math import *:導入math包的所有功能,使它們都能直接使用。

(2)from math import sin, cos:導入math包,並使其中兩個函數sin和cos直接可用,列出多個名字時用逗號分隔。

(3)import math:導入整個數學包,但其中的功能只能通過math.sin、math.cos的形式使用。這樣做只在環境中加入math的定義,有利於避免名字衝突。

8.python中字符串的類型名爲str

9.字符串字面量:

(1)用一對單引號或者一對雙引號括起的一串字符。

(2)一對連續的三個單引號或者一對連續的三個雙引號作爲括號。在這種字面量中可以換行,換行符也作爲字符串的內容。

10.標準函數len用來求字符串長度。

11.字符串中每個字符有一個位置,稱爲下標,下標的值一般從0到len(s)-1,但python允許負下標,-1表示最後一個字符,以此類推。

12.加法運算符也表示字符串拼接操作。

13.切片操作:

(1)s[m:n]:得到包含字符s[m]到s[n-1]的串

(2)s[m:n:d]得到下標m到n-1範圍裏,按下標步進值d選出的字符構造出的串。m省略時表示0,n省略時表示len(s),d省略時表示1

14.給原來沒定義的變量賦值,該變量就有了定義(賦值即定義規則)

15.輸出函數print,多項輸出之間加空格分隔,如下

16.註釋:用#開頭

17.賦值語句的兩種擴展形式:

(1)變量=變量=.....=表達式

(2)變量,變量,......=表達式,表達式,.......

第二種形式要求把一系列表達式的值分別賦給一系列變量,按位置對應,變量和表達式的個數必須相同。

18.pass語句,執行時什麼也不做,常用於填補結構缺位.

19.python種不返回值的標準函數都返回特殊值None,如果不需要結果,或沒有合適的值作爲結果,就可以考慮用None.

20.python允許在一行中出現多個語句,這時需要在語句之間加分號.

x = len; y = x + 1

21.邏輯類型bool,邏輯值用關鍵字True和False表示.

22.邏輯運算符:or或(或者)    and與    not非(否定)

23.x>1andx<10可以簡寫爲1<x<10;x>10andx>y**2也可簡寫爲10<x>y**2.

24.if語句的擴展形式:

if 表達式:
    語句組
elif 表達式:
    語句組
else:
    語句組

 解釋器至多執行其中的一個語句塊.

25.數值類型的0值都當作假,這些類型的所有非0值都當作真.另外,None也被當作假.組合類型的各種空值也當作假,包括空表,空元祖,空字典,空集合.

26.for語句用一個迭代描述來控制成分語句組的重複執行,基本形式是:

for 變量 in 迭代描述:
    語句組

27.兩種簡單的迭代描述:

(1)用逗號分隔列出若干表達式,表示一個值序列

n = 3
for i in n+2, n-1, n**2:
    print(i)

(2)標準函數range描述整數的等差序列,常用於for語言

s = 0
for i in range(100):
    s = s + i

28.range的幾種調用形式:

(1)range(n)表示序列0,1,2,......,n-1

(2)range(m,n)表示序列m,m+1,......,n-1

(3)range(m,n,d)表示序列m,m+d,m+2d,........,是等差值爲d的序列(d爲負時序列遞減),直至最接近但不包括n的那個值.

調用range得到的對象稱爲迭代器(對象).

29.循環描述只在for語句開始時求值一次.

30.while語句

while 表達式:
    語句組

31.循環控制:

(1)break語句:結束當前循環語句.

(2)continue:結束本次迭代.

32.函數定義:

def 函數名(參數列表):
    語句組

33.變量是程序中最基本的抽象機制,是一種值抽象.

34.標準函數isinstance(x,t)專用於檢查x的類型是否爲t,如下

#檢查a的是否爲int類型的
isinstance(a, int)

35.斷言語句的兩種形式:

(1)assert 條件

斷言語句強制要求斷言成立,否則就報錯.如果執行時條件爲真,這個語句就結束;否則就報告AssertionError,默認情況下導致程序終止.

(2)assert 條件, 表達式

這種形式裏的表達式可以是任意表達式,條件爲假時求該表達式,得到的值作爲AssertionError的參數.

與if語句不同,斷言語句應該只用於程序正確執行的必要條件.

例:以求階乘函數爲例.顯然,這個函數必須是整數,參數爲負時階乘無定義.加入斷言語句後的函數定義是:

def fact(n):
    #斷言,如果n不是整數或者不是正數則程序報錯
    assert isinstance(n, int) and n >= 0
    prod = 1
    for k in range(2, n+1):
        prod = prod * k
    return prod

36.文檔串:python提供文檔串機制,如果函數體裏第一個語句是字符串,它就是該函數的文檔串.

37.python允許在函數中定義局部函數

38.隨機數:
(1)random():返回半閉半開區間[0.0, 1.0)中一個隨機浮點數.

(2)randrange(n), randrangr(n, m), randrange(m, n, d):返回給定區間裏的隨機整數

(3)randint(m, n):相當於randrange(m, n+1)

(4)choice(s):從字符串s裏隨機選取一個字符.

(5)seed(n):用整數n重置隨機數生成器,其無參形式用系統當時的事件重置隨機數生成器.調用seed()就是要求重新開始一個隨機序列.

39.lambda表達式

(1)python提供了用於描述匿名函數的lambda表達式,lambda表達式是一種表達式,用於描述小的匿名函數.

(2)語法形式

lambda 參數,...: 表達式

(3)lambda表達式求值得到一個匿名的函數對象,它以描述中的參數爲形參.調用這種函數對象時先建立形實參關聯,而後算出表達式的值作爲結果.

(4)lambda表達式可以直接當作函數使用,也可以賦給變量或傳給需要函數參數的函數等.下面的lambda表達式被作爲函數直接應用於實參:

(lambda x, y: x**2 + y**2)(3, 4)

這是一個函數調用式,其值是25.注意,由於優先級問題,這裏的lambda表達式必須加括號.

(5)實例:

#普通單行函數
def sum(x, y):
    return x+y

#lambda表達式
p = lambda x, y:x+y
print(p(4, 6))

要點:lambda函數不能包含命令,並且包含的表達式不能超過一個.

(6)lambda匿名函數的格式:冒號前是參數,可以有多個,用逗號隔開,冒號右邊的爲表達式.其實lambda返回值是一個函數的地址,也就是函數對象.

40.作用域

(1)python解釋器處理程序時首先掃描代碼,根據賦值即定義規則靜態確定局部作用域裏定義的變量.在一些特殊情況下,這種規定可能帶來出人意料的現象.

代碼:

x = 1
def fun2():
    y = x #這時無定義
    x = 2 
    return x + y

錯誤信息說在帶註釋的語句處變量x未賦值就使用是錯誤的.首先,函數定義看作一個整體,解釋器靜態檢查fun2函數體的代碼,確定局部定義的變量,這裏出現了對x和y的賦值,因此它們都是局部變量.根據唯一定義原則,fun2裏出現的x和y都是這兩個局部變量的使用.然而,在執行函數體的第一條語句時,局部變量x沒有賦值,因此解釋器發現了局部變量未賦值就使用的錯誤.

(2)在變量定義與作用域的關係方面的3條規則:

(1)在一個作用域裏,一個名字只有一個定義;(唯一原則)

(2)如果出現作用域嵌套,內層作用域裏的變量定義屏蔽外層作用域裏的同名變量.如果沒有屏蔽,局部作用域裏可以使用外圍作用域中定義的變量;(就近原則)

(3)互不嵌套的不同作用域裏定義的同名變量相互無關.

41.全局和非局部聲明

(1)全局變量聲明語句,其形式是:

global 變量名, ......

這種語句應該出現在局部作用域裏,關鍵字global後可以列出多個變量名,用逗號分隔.

(2)非局部變量

有時也需要在內部函數定義裏修改外圍函數的變量(而不是全局變量).python爲這種需要引進了nonlocal聲明語句,形式是:

nonlocal 變量名, .....

這種語句聲明在本函數體裏出現的變量名不是局部變量,應該到外圍(但非全局)作用域去找它們的定義,找不到就是錯誤.

(3)一個lambda表達式也引入一個局部作用域.

42.帶默認值形參和關鍵字實參

(1)如果要給帶默認值形參提供值,應該用"形參名=表達式"的實參形式,這種實參形式稱爲關鍵字實參,形參名稱爲關鍵字.關鍵字實參必須出現在普通實參之後,多個關鍵字實參的順序不重要,解釋器用實參的關鍵字與函數形參匹配.

(2)帶默認值形參應該排在所有無默認值的形參之後.

(3)無關鍵字實參順序匹配(在沒有關鍵字的情況下).

43.字符集

python採用統一碼字符集unicode,源文件默認採用utf-8編碼,但允許在源文件第一行給出特定的編碼說明.最常見的編碼說明形式是:

# -*- coding: <encoding-name> -*-

44.python語言的關鍵字

and    as    assert    break    class    continue    def    del    else    except    elif    False    finally    for    from    global    

if    in    import    is    lambda    None    nonlocal    not    or    pass    return    raise    True    try    while    with    yield

45.循環語句的else段

(1)在for語句和while語句的主體部分之後都可以有一個else段,該段以關鍵字else作爲頭部(後跟一個冒號),該段的體也是一個語句組.

(2)當for語句完成了對所有迭代值的循環迭代,或者while語句的條件求出假值時,解釋器執行其else段語句組,執行完畢後這個循環語句結束.如果循環體由於其他情況結束,例如遇到break語句或return語句,就不執行else段.

(3)else段可用於描述只在循環語句正常結束時需要做的操作.

 

第二章    數據的構造和組織

2.1.1表(List)

1.表的類型名爲list(又叫列表).

2.表的創建:

(1)列舉式:

a1 = [1, "Math", 89.7]

b1 = [sin(1.0), cos(1.0), tan(1.0)]

方括號裏的元素可以是任意表達式,空表用[]表示.

表是序列,可以用下標訪問表中的元素,首元素的下標是0.

標準函數len可以求出表的長度.list1[-1]得到list1的最後一個元素.

表對於元素沒有限制,表的元素也可以是表.

元組和表只有一點差別:表可以修改,元組創建之後就不能修改.

(2)通過操作構建新表:
表類型名list也是一個標準函數,可用於創建新表(實際上是做類型轉換),list實參應該是序列或者迭代器對象.

list2 = list("abc")

相當於列舉式["a", "b", "c"],把字符串看作字符的序列.

list3 = list(range(100))

python把迭代器和序列統稱爲可迭代對象(python術語iterable)

操作+和*可用於各種序列,應用於表時得到新表.如果list1和list2都是表,在list1+list2得到的表前面順序排列着list1的元素,後面是list2的元素.list1*n(n爲整數)得到list1的元素重複n次的表.

下面是兩種經常用到的表:

(1)構造已知長度的全0值的表,用[0]*n;

(2)構造一定長度,元素值待定的表,用[None]*n.

list1.append(x)把x加入list1作爲最後的元素.

3.處理表的基本方法

(1)最直接的寫法是:

for i in range(len(list1)):    #用表長度生成循環範圍

    ......list[i].......

實際上,序列也可以作爲迭代描述,可用於逐個處理表中元素:

for x in list:

    .....x......

注意,這種寫法只能用於取得表元素,不能修改表元素(不能做元素賦值).

2.1.3元組(tuple)

1.元組的類型名爲tuple.

2.元組也屬於序列類型,元組對象可以包含任意多個元素,元素下標從0開始,可以用過下標表達式訪問元組的元素.一個元組裏的元素可以同屬於一個類型,也可以屬於不同類型.元組的特殊之處是創建後不能修改,結構不能變(不能加入和刪除元素),其中元素也不能變(不能給元素賦值).

3.元組的創建和操作

創建元組的最基本方法也是列舉式:

tp1 = (1, 2, 3)

元組列舉式可以不寫括號

tp2 = 1, 2, 3

可以用標準函數tuple創建元組,實參應該是可迭代對象,可以是迭代器,或者表,字符串等.tuple()或()都可用於創建空元祖.

應特別注意,創建只有一個元素的元組時,逗號是必須的,括號則不重要.

不寫逗號的帶括號表達式,如(12),被認爲是突通的加括號表達式,用於說明表達式的運算順序和優先結合,而不是元組.

元組也可以任意嵌套.

雖然元組本身不能變化,但可以包含能夠修改的元素

4.賦值中的打包和拆分

python支持一對稱爲打包和拆分(解包)的隱式動作,是我們可以方便地把若干數據項包裝爲一個整體,或者把包含幾個元素的對象拆開使用.

實際上,各種序列都可以拆分,只要賦值兩邊的結構相同.

a, b, c = [1, 2, 3]

a, [b, c] = [1, (2, 3)]

a, (b, c), d = [1, (2, 3), 4]

允許兩層拆分.

如果序列s1的元素都是包含兩個元素的元組或兩個元素的表,可以寫:

for x, y in s1:

    ....x.....y....

在迭代中,變量x和y將分別以s1的一個元素的兩個成員爲值.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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