1、range的使用:
range(5):包含左邊不包含右邊
range()函數的語法如下:
range(start, end[, step])
參數說明:
start: 計數從 start 開始。默認是從 0 開始。例如 range(5) 等價於 range(0, 5);
end: 計數到 end 結束,但不包括 end。例如:range(0, 5) 等於 [0, 1, 2, 3, 4],沒有5;
step:步長,默認爲1。例如:range(0, 5) 等價於 range(0, 5, 1)
a[-3]:從後邊數第三個
a[2-3]=a[-1]:倒數第一個
2、python數據類型
Python標準的內置數據類型有:
Number(整數型 int , 浮點數型 float, 布爾型 bool , 複數 complex)
String List Tuple Set Dictionary
Python可變數據類型:可改變變量的值,且不會新建對象
List Dictionary Set
Python不可變數據類型:不允許變量的值發生改變,發生改變時會新建對象
Tuple string Number
3、深拷貝和淺拷貝
python2,3: 列表和字典直接賦值是淺拷貝,淺拷貝情況下對其中一個的改變都會相應改變另一個
深拷貝:拷貝完完全不相干了
a=2
b=a #淺拷貝
b=a.copy() #深拷貝
解答:
import copy
a = [1, 2, 3, 4, [‘a’, ‘b’]]
b = a # 引用,除非直接給a重新賦值,否則a變則b變,b變則a變
c = copy.copy(a) # 淺複製,只會拷貝父對象, 不會拷貝父對象中的子對象,所以若a的子對象變則c 變,但是父對象變c不會變
d = copy.deepcopy(a) #深拷貝,完全拷貝,完全獨立於原對象,a變也不變
a.append(5) # 改變父對象
a[4].append(‘c’) #改變父對象中的 [‘a’, ‘b’]子對象
#a=[1, 2, 3, 4, [‘a’, ‘b’,‘c’],5]
b=[1, 2, 3, 4, [‘a’, ‘b’,‘c’],5]
c=[1, 2, 3, 4, [‘a’, ‘b’,‘c’]]
d=[1, 2, 3, 4, [‘a’, ‘b’]]
4、閉包
- 如果在一個函數的內部定義了另一個函數,外部的我們叫他外函數,內部的我們叫他內函數。
- 在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
- 一般情況下,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然後自己再結束。
具體就是5+6+5=16
5、xrange
1.xrange() 函數用法與 range 完全相同,
所不同的是生成的不是一個數組,而是一個生成器。
2.0的任何次方的值都爲1
6、math.floor函數
Python3中答案是5,向下取整,結果爲整型,Python2中答案是5.0
以下是 Python3 幫助文檔的說明,math.floor() 函數的返回值應爲整型,而不是浮點型,所以答案應該爲5。
更正說明:正確答案應該是B,由於本人沒注意到是 Python2 的執行環境,導致以上分析有誤,在此致歉。
感謝 @HarrisonShen 的提醒,原來 Python2 的 math.floor() 函數返回值是浮點型,請大家注意!所以答案應該爲5.0。
詳情可參考官方文檔:Python2 math.floor
7、系統變量
name:name是一個變量,前後加了__ __標記爲系統變量,name__用於標識模塊的名字的一個系統變量。
當我單獨執行一個模塊,我的這個系統變量的值爲__main
當我在模塊2導入“這個模塊”後,”這個模塊”的__name__值爲這個模塊的名稱:“這個模塊”。在不同的場所用更方便你理解的化名。
‘main’:是頂級代碼執行的作用域的名稱。
8、python中主要存在四種命名方式
Python中單下劃線_foo與雙下劃線__foo與__foo__的成員
1、object #公用方法
2、_object #半保護
#被看作是“protect”,意思是隻有類對象和子類對象自己能訪問到這些變量,
在模塊或類外不可以使用,不能用’from module import *’導入。
#object 是爲了避免與子類的方法名稱衝突, 對於該標識符描述的方法,父
類的方法不能輕易地被子類的方法覆蓋,他們的名字實際上是
classname__methodname。
3、 _ object #全私有,全保護
#私有成員“private”,意思是隻有類對象自己能訪問,連子類對象也不能訪
問到這個數據,不能用’from module import *’導入。
4、 _ object _ #內建方法,用戶不要這樣定義
8、python中Unicode編碼
在Python 2.7中,下列哪種是Unicode編碼的書寫方式?
解析:
unicode是一種編碼標準,具體的實現標準可能是utf-8,utf-16,gbk ……python 在內部使用兩個字節來存儲一個unicode,使用unicode對象而不是str的好處,就是unicode方便於跨平臺。你可以用如下兩種方式定義一個unicode:
s1 = u"人生苦短"
s2 = unicode(“人生苦短”, “utf-8”)
r/R:非轉義的原始字符串
b:bytes
python3.x裏默認的str是(py2.x裏的)unicode, bytes是(py2.x)的str, b”“前綴代表的就是bytes
python2.x裏, b前綴沒什麼具體意義
9、單引號、雙引號
python裏面%d表數字,%s表示字符串,%%表示一個%;
單引號內嵌套單引號需要轉義字符/;單引號內嵌套雙引號不需要嵌套;
雙引號內嵌套雙引號需要轉義字符/;雙引號內引用單引號不需要轉義字符;
10、協程
線程由操作系統控制,
協程由程序自身控制
協程是一種用戶態的輕量級線程,協程的調度完全由用戶控制。協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。
11、golbal的使用
當內部作用域想修改外部變量時,需要使用global聲明。
What gets printed?(4)
counter = 1
def doLotsOfStuff():
global counter
for i in (1, 2, 3): #i爲1,2,3
counter += 1
doLotsOfStuff()
print counter
12、python的三元運算符
min = x if x<y else y
13、異常
try:的語句出現異常纔會執行except後的語句,如果正常,則執行完try後執行else。另外,finally語句不管有無異常都會執行。
14、函數名
在 Python 中萬物皆爲對象,函數也不例外,函數作爲對象可以賦值給一個變量、可以作爲元素添加到集合對象中、可作爲參數值傳遞給其它函數,還可以當做函數的返回值,這些特性就是第一類對象所特有的。
15、複數
(1)表示複數的語法是real + image j
(2)實部和虛部都是浮點數
(3)虛部後綴可以爲j或J
(4)方法conjugate返回複數的共軛複數
16、解釋性語言
解釋型語言的特性:
非獨立
效率低
解釋性語言和編譯性語言的定義:
計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。
翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。
解釋性語言的定義:
解釋性語言的程序不需要編譯,在運行程序的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就需要逐行翻譯一次,效率比較低。
現代解釋性語言通常把源程序編譯成中間代碼,然後用解釋器把中間代碼一條條翻譯成目標機器代碼,一條條執行。
編譯性語言的定義:
編譯性語言寫的程序在被執行之前,需要一個專門的編譯過程,把程序編譯成爲機器語言的文件,比如exe文件,以後要運行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe文件),因爲翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高。
17、對象的布爾值是false
下列對象的布爾值都是False:
NONE;
False(布爾類型)
所有的值爲零的數
0(整型)
0.0(浮點型)
0L(長整型)
0.0+0.0j(複數)
“”(空字符串)
[](空列表)
()(空元組)
{}(空字典)
18、布爾測試
字典類型也是可以用於布爾測試的
19、字符串編碼和解碼
有一段python的編碼程序如下:urllib.quote(line.decode(“gbk”).encode(“utf-16”)),請問經過該編碼的字符串的解碼順序是
字符串編譯的過程:gbk==>unicode==>utf16==>url解碼
字符串解碼順序爲:url解碼==>utf16==>unicode==>gbk
20、比較大小
複數不能比較大小,ASCII碼中小寫字母>大寫字母>數字
選項 D:字符串的比較與 tuple 類似,也是從第一個字符開始比較 ASCII 碼,直到兩個字符不相等爲止。
字母與數字的ASCII 碼大小範圍是== “a-z” > “A-Z” > “0-9”==,D選項中 ‘a’ < ‘x’,
21、lambda表達式
lambda表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。
map()接收兩個參數,一個是功能函數f,一個list,並將f依次作用在list的每個元素上,並返回一個新的list,a**b是求a的b次方的意思
[1,8,27]
22、python不支持的數據類型
python 中的標準數據類型:
其中數字類型有:
注意:
string 不是 char!!!
可變數據類型:列表list[ ]、字典dict{ }
不可變數據類型:整型int、字符串str’ '、元組tuple()
23、函數的參數順序
Python參數順序:必選參數、默認參數、可變參數(*args)和關鍵字參數(**kwargs)。
當args與位置參數和默認參數混用的情況下:(注意三者的順序)
示例一、(三者順序是:位置參數、默認參數、*args)
def foo(x,y=1,*args):
pass
foo (1,2,3,4,5)
// 其中的x爲1,y=1的值被2替換,3,4,5都給args,即args=(3,4,5)
示例二、(三者順序是:位置參數、*args、默認參數)
def foo(x,*args,y=1):
pass
foo (1,2,3,4,5)
// 其中的x爲1,2,3,4,5都給args,即args=(2,3,4,5),y始終爲1
kwargs:(表示的就是形參中按照關鍵字傳值把多餘的傳值以字典的方式呈現)
關於kwargs與位置參數、*args、默認參數混着用的問題:(注意順序)
位置參數、*args、**kwargs三者的順序必須是位置參數、*args、**kwargs,不然就會報錯:
示例:
def foo(x,*args,**kwargs):
pass
foo (1,2,3,4,y=5,a=6,b=7) // 其中的x爲1,2,3,4都給args,即args=(2,3,4),y=5,a=6,b=7以字典形式傳給kwargs,
即kwargs={‘y’:5,‘a’:6,‘b’:7}
24、裝飾器
先計算foo的值,在作爲參數傳遞給dec。
25、賦值
多重賦值:x=y=z=1
多元賦值:x,y,z=1,3,‘a string’
增量賦值:x+=1
但是y=(x=x+1)
並不適用python,等號右邊不能是賦值語句
26、邏輯運算
下列代碼運行結果是? c
a = ‘a’
print a > ‘b’ or ‘c’