基於Python 3.4.3
一 二 三 四 基礎
print 三版必須加括號,二版不用加
alt + n :上一條語句
alt + p :下一條語句
打印三條hello
沒有大括號,用縮進來表示
BIF 內建函數
使用變量前要先對其賦值
字母可以使大小寫,但是大小寫是不同的
字符串可以用單引號或者是雙引號
原始字符串:在字符串前面加上r,就不用加轉義字符了
長字符串,多行,用三引號字符串
條件分支
if 條件:
條件為真執行的操作
else:
條件為假執行的操作
猜數字:
1 print("這是一個猜數字游戲") 2 import random 3 secret = random.randint(1,10) 4 temp = input("請輸入1-10數字:") 5 guess = int(temp) 6 while guess != secret: 7 if secret > guess: 8 temp = input("小了\n") 9 guess = int(temp) 10 else: 11 temp = input("大了\n") 12 guess = int(temp) 13 print("恭喜答案正確")
五 變量類型
整型、浮點、e記法、布爾類型(布爾類型首字母大寫,True,False)
不要把str當作變量名,str()是個BIF
獲得關於類型的BIF type()
python更建議用isinstance()判斷類型,返回值是bool
六 操作符
+ - * % ** //
可以寫成 a = b = c = d = 10
冪運算的優先級比起左側操作符高,比右側操作符低
>>> -3 ** 2
-9
>>> 3 ** -2
0.1111111111111111
七 八 九 分支和循環
1 score = int(input("請輸入一個分數:")) 2 if 90 <= score <=100: 3 print("A") 4 elif 80 <= score <90: 5 print("B") 6 elif 70 <= score <80: 7 print("C") 8 elif 60 <= score <70: 9 print("D") 10 else: 11 print("E")
三元操作符
語法: x if 條件 else y
eg:
x = 6
y = 5
small = x if x<y else y
print(small)
結果:
5
for循環
1 s = "favourite" 2 for i in s: 3 print(i,end = " ")
列表
member = ["a","ab","abc","abcd","abcde","abcdefg"] for i in member: print(i,len(i))
range()
range([strat,][stop][,step=1])
經常與for循環使用,這個BIF有三個參數,其中中括號括起來的的兩個表示這兩個參數是可選的。
step=1表示第三個參數的值默認值是1
range這個bif的作用是生成一個從start參數的值開始到stop結束的序列
break
1 print("這是一個猜數字游戲") 2 import random 3 secret = random.randint(1,10) 4 guess = int(input("請輸入1-10數字:")) 5 while True: 6 if guess == secret: 7 break 8 else: 9 guess = int(input("輸入錯誤,請重新輸入")) 10 print("恭喜答案正確")
十 十一 十二 列表
查看列表方法:
列表可以是混合類型的
列表可以使空的
Noen是Python的一個內建值
.append()表尾追加一個值
.extend()在表尾追加一個列表
.insert(位置,元素)
.index(元素) 獲取元素位置
可以加上搜索范圍.index(元素,其實位置,終止位置)
.remove(元素) 刪除元素
del 序列[位置]
.pop(元素位置) 默認是最后一個
.count(元素) 計算元素個數
.reverse() 元素翻轉
.sort() 排序
改變原始列表
倒序可以:
列表分片
第一個索引是提取第一個元素的編號,而最后的索引則是分片之后剩余部分的第一個元素的編號
也就是第一個索引元素包含在分片之內,而第二個則不包含在分片之內
列表復制一定要用這種方法
列表能用的元算 +(兩個序列必須類型一致) *
成員資格 in
訪問列表中的列表,類似於二維數組
十三 元組
元組不可修改,是由括號和逗號定義的
修改元祖只能給其重新賦值:
十四 字符串方法
字符串和元組一樣都是都是不可改變的
幾個常用的方法:
.find()
find方法可以在一個較長的字符串中查找子串。返回字串所在位置最左端的索引,如果沒有則返回-1。這個方法可以接收可選的起始點或結束點參數
.lower()
返回字符串的小寫字母版,主要用於編寫不區分大小寫的代碼
.split()
分割字符串成序列,如果不提供任何分割符,則把所有空格當作分隔符
.joint()
split的逆方法,分隔符.join(字符串)
.replace()
返回字符串的所有匹配項被替換后的字符串,.replace(“被替換”,“替換”)
.translate()
translate方法只處理單個字符,優勢在於可以同時進行多個字符替換,使用translate轉換之前,需要先完成一張轉換表
注意import的是string,但是用的時候是str
十五 字符串格式化
.format() 位置輸出
% 格式化操作符
用#填充數字進制格式
控制字段寬度精度
總結:
十六 序列
列表、元組和字符串放在一塊兒來講解是有道理的,我們發現Ta們之間有很多共同點:
1. 都可以通過索引得到每一個元素
2. 默認索引值總是從0開始(當然靈活的Python還支持負數索引)
3. 可以通過分片的方法得到一個范圍內的元素的集合
4. 有很多共同的操作符(重復操作符、拼接操作符、成員關系操作符)
所以我們把他們叄統稱為:序列
序列常用的方法
list(iterable) 把一個可迭代對象轉換為列表
tuple([iterable]) 把一個可迭代對象轉換為元組
str(obj) 把obj對象轉換為字符串
len(sub) 返回sub的長度
max() 返回序列或者參數集合中的最大值
min() 返回序列或者參數集合中的最小值
sum(iterable[, start=0]) 返回序列iterable和可選參數start的總和
sorted(iterable, key=None, reverse=False) 返回一個排序的列表,使用方法跟列表的內建函數(list.sort())一致,注意,這個sorted()后邊有“ed”哦。
reversed(sequence) 返回逆向迭代序列的值,一樣道理,跟列表的內建函數(list.reverse())一致,注意,這個reversed()后邊也多了個“d”哦。
enumerate(iterable) 生成由每個元素的index值和item值組成的元組
zip(iter1 [,iter2 […]]) 返回由各個參數的序列組成的元組
二十五 二十六 字典
字典是Python語言中唯一的映射類型。
映射類型對象里哈希值(鍵,key)和指向的對象(值,value)是一對多的的關系,通常被認為是可變的哈希表。
字典對象是可變的,它是一個容器類型,能存儲任意個數的Python對象,其中也可包括其他容器類型。
字典類型與序列類型的區別:
1.存取和訪問數據的方式不同。
2.序列類型只用數字類型的鍵(從序列的開始按數值順序索引);
3.映射類型可以用其他對象類型作鍵(如:數字、字符串、元祖,一般用字符串作鍵),和序列類型的鍵不同,映射類型的鍵直
4.接或間接地和存儲數據值相關聯。
5.映射類型中的數據是無序排列的。這和序列類型是不一樣的,序列類型是以數值序排列的。
6.映射類型用鍵直接“映射”到值。
字典的創建
特點:
1、鍵與值用冒號“:”分開;
2、項與項用逗號“,”分開;
3、字典中的鍵必須是唯一的,而值可以不唯一。
使用工廠函數dict()創建字典:
注意括號的個數,因為dict()只接受一個參數,所以用()把鍵值對包括
鍵值對的增加與刪除
字典的方法
1、adict.keys() 返回一個包含字典所有KEY的列表;
2、adict.values() 返回一個包含字典所有value的列表;
3、adict.items() 返回一個包含所有(鍵,值)元祖的列表;
4、adict.clear() 刪除字典中的所有項或元素;
5、adict.copy() 返回一個字典淺拷貝的副本;
直接賦值並沒有創建新的內存空間
6、adict.fromkeys(seq, val=None) 創建並返回一個新字典,以seq中的元素做該字典的鍵,val做該字典中所有鍵對應的初始值(默認為None);
初始化一個空字典:
注意,僅僅是返回一個新字典,並不能改變舊字典,要想改變必須用a = a.fromkeys
7、adict.get(key, default = None) 返回字典中key對應的值,若key不存在字典中,則返回default的值(default默認為None);
一般來說如果試圖訪問字典中不存在的項時會出錯,而用get就不會
8、 in 、 not in;
9、adict.iteritems()、adict.iterkeys()、adict.itervalues() 與它們對應的非迭代方法一樣,不同的是它們返回一個迭代子,而不是一個列表;
10、adict.pop(key[,default]) 和get方法相似。如果字典中存在key,刪除並返回key對應的vuale;如果key不存在,且沒有給出default的值,則引發keyerror異常;
11、adict.setdefault(key, default=None) 和set()方法相似,但如果字典中不存在Key鍵,由 adict[key] = default 為它賦值;
12、adict.update(bdict) 將字典bdict的鍵值對添加到字典adict中。
字典中的鍵,值,鍵值對用 .keys() .values() .items()表示
二十七 集合
集合不會出現重復元素,用{}標記,set()函數將其他容器類型轉變為集合,有.add()和.remove()方法,當用frozenset()函數定義一個集合時,這個集合不可改變
函數
裴波那切的例子:
利用上列表的-1 -2來表示后兩個元素的方法很巧妙
1 def fibs(num): 2 a = [0,1] 3 for i in range(num-2): 4 a.append(a[-1] + a[-2]) 5 return a 6 7 num = int(input("How many Fibonacci nubmers do you want:")) 8 print(fibs(num))
執行結果:
另一個方法 :
1 def fib(num): 2 n,a,b = 0,0,1 3 while(n < num): 4 print(b) 5 a,b = b,a+b 6 n += 1 7 num = int(input("How many Fibonacci nubmers do you want:")) 8 fib(num)
在函數里面修改全局變量的值需要加上globle,否則將在函數內創建另一個同名的局部變量
1 num = 3 2 def chcange_globle(): 3 global num 4 num = 6 5 print(num)
注意是globle不是global(前者是名次,后者是形容詞)
關鍵字參數和默認參數
在函數調用過程中用參數名提供的參數是關鍵字參數
在函數定義過程中用參數名提供的參數是默認參數
1 def who_words(name = '王尼瑪',words = '來來來'): 2 print(name,words) 3 who_words()#使用默認參數 4 who_words('丁尼瑪') 5 who_words(words = '我草',name = '趙尼瑪')#使用關鍵字參數
收集函數
*params
1 def print_params(*params): 2 print("the num of params is :",len(params)) 3 print("the third param is :",params[2]) 4 print(params) 5 print_params('a','b','c','d','e')
若參數中還有其他參數需要用關鍵字參數指出,否則會被認成收集參數,導致程序出錯
1 def print_params(*params,name,age): 2 print("the num of params is :",len(params)) 3 print(params) 4 print(name,age) 5 print_params('a','b',name = '王叔叔',age = '22')
**params
返回字典
1 def fun(**params): 2 print(params) 3 fun(x=1,y=2)
嵌套
一個函數放在另一個函數里面,就是嵌套
閉包:如果在一個內部函數,對在外部作用域引用的變量,內部函數就叫做閉包
1 def fun1(x): 2 def fun2(y): 3 return x*y 4 return fun2()
兩種實現方式:
遞歸
1 def han(n,x,y,z): 2 "將n層漢諾塔從x移動到z上" 3 if n == 1: 4 print(x,'-->',z) 5 else: 6 han(n-1,x,z,y) 7 print(x,'-->',z) 8 han(n-1,y,x,z) 9 n = int(input("input n:")) 10 han(n,'X','Y','Z')
執行結果:
如果在函數開頭寫下字符串,它會作為函數的一部分進行存儲,這稱為文檔字符串。調用方法:函數名.__doc__ (注意是雙下划線)
函數式編程
某些語言使用函數就可以完成所有的事(Lisp,Erlang,F#),沒有變量,只有輸入輸出和函數(以上為自己理解)
Python提供函數式編程思想的函數有:lambda、map、filter、reduce
lambda:
map:將序列中的元素全部傳遞給一個函數
map(function, sequence[, sequence, ...]) -> list
通過定義可以看到,這個函數的第一個參數是一個函數,剩下的參數是一個或多個序列,返回值是一個集合。
function可以理解為是一個一對一或多對一函數,map的作用是以參數序列中的每一個元素調用function函數,返回包含每次function函數返回值的list。
filter:過濾出為真值的列表
filter(function or None, sequence) -> list, tuple, or string
function是一個謂詞函數,接受一個參數,返回布爾值True或False。
filter函數會對序列參數sequence中的每個元素調用function函數,最后返回的結果包含調用結果為True的元素。
求奇數: