if語句
雖然語法比較嚴(yán)格,但是語法糖也是較多的,比如我嘗試用下面的if語句寫了一個表達(dá)式,多樣性的
-
if加不加括號都可以 -
elif是else if的縮寫 - 最近一直在用kotlin,寫的
if..else..多了,就給黃色警告,提示可以切成switch,所以同理,下面的用法也可以替代switch
>>> x = int(input("enter num"))
enter num50
>>> if(x<0):
... x=0
... print("歸零")
... elif x==0:
... print("0")
... elif(x==1):
... print("1")
... else:
... print("more")
...
more
for循環(huán)
Python中的for循環(huán)與C和java中的不太一樣,格式和kotlin有點(diǎn)像,但也可以看出他的含義,注意語法就行了
# python普通for循環(huán)
>>> nums = ['one','two','three']
>>> for num in nums:
... print(num,len(num))
...
one 3
two 3
three 5
# kotlin和python的普通循環(huán)方式很像
val nums = arrayOf("one", "two", "three")
for (num in nums) {
println(num)
}
# 傳統(tǒng)java的循環(huán)方式
String[] nums = new String[]{"one","two","three"};
for (String num : nums) {
System.out.println(num);
}
# python循環(huán)添加
>>> nums = ["one","two","three"]
>>> nums
['one', 'two', 'three']
# 循環(huán)中的切片副本必須顯式調(diào)用
>>> for num in nums[:]:
... if len(num) >3:
... nums.insert(0,num)
...
>>> nums
['three', 'one', 'two', 'three']
range()函數(shù)
如果需要迭代遍歷數(shù)字,那可以直接用內(nèi)置函數(shù)range(),它會生成等差數(shù)列
# 類似傳統(tǒng)的普通for循環(huán)
>>> for num in range(3):
... print(num)
...
0
1
2
# 范圍循環(huán)
>>> for num in range(5,10):
... print(num)
...
5
6
7
8
9
# 間隔循環(huán)
>>> for num in range(0,10,3):
... print(num)
...
0
3
6
9
# 間隔負(fù)循環(huán)
>>> for num in range(0,-100,-25):
... print(num)
...
0
-25
-50
-75
# 遍歷序列索引,合并range()和len()函數(shù)
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
# 配合list
>>> list(range(5))
[0, 1, 2, 3, 4]
后面還有一些循環(huán)技巧,例如
>>> for i ,j in enumerate(["zhangsan","lisi","wangwu"]):
... print(i,j)
...
0 zhangsan
1 lisi
2 wangwu
控制流都這么多,這些技巧的到后面必須掌握一些
pass語句
一般程序執(zhí)行的時候,什么都不做就什么都不用寫,但是python不行,需要顯式調(diào)用pass,表示忽略,或者可以理解為抽象方法,抽象類等等
調(diào)試的時候,不是經(jīng)常這么干么?創(chuàng)建了一個函數(shù),還來不及具體實現(xiàn)?就可以先用pass頂上
# 空循環(huán)
>>> while True:
... pass
...
# 空類
>>> class EmptyClass:
... pass
...
# 待定義函數(shù)
>>> def init(*args):
... pass
...
定義函數(shù)def
- 用關(guān)鍵詞
def修飾的方法稱為定義函數(shù),嗯,就是定義一個函數(shù)。 - 必須遵循函數(shù)名和正式參數(shù)的圓括號列表
- 函數(shù)主體從下一行開始
- 必須遵從縮進(jìn)原則
- 函數(shù)可以通過賦值操作,并將值同時賦予
普通應(yīng)用
# 定義一個斐波那契數(shù)列
>>> def fib(n):
... a,b = 0,1
... while a<n:
... print(a,end=" ")
... a,b = b,a+b
... print()
...
# 測試結(jié)果
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 值傳遞
>>> fibonacci = fib
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 打印出來的函數(shù)可以為None
# 先證明是有值的
>>> fib(20)
0 1 1 2 3 5 8 13
>>> fib(0)
>>> print(fib(0))
None
帶返回值
上面的斐波那契數(shù)列雖然能打印出來,但其實是沒有返回值的,以返回數(shù)組為例
>>> def fib(n):
... # 初始化一個空數(shù)組
... result = []
... a,b = 0,1
... while a<n:
# append是追加到末尾的
# 等價于result = result + [a]
... result.append(a)
... a,b = b, a+b
... return result
...
>>> fib(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
# 并且也可以賦值
>>> fib50 = fib(50)
>>> fib50
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
高級定義函數(shù)
參數(shù)默認(rèn)值
顧名思義,就是給參數(shù)賦默認(rèn)值,用Python自帶的IDLE試試
默認(rèn)值
- 只計算一次
- 只對定義范圍內(nèi)的函數(shù)定義處進(jìn)行評估
- in關(guān)鍵詞可以檢索序列中是否包含一定的值
# 定義函數(shù),prompt必填,后兩個選填
>>> def sayOk(prompt, retries = 4, reminder = "try again!"):
while True:
ok = input(prompt)
if ok in ("y", "ye", "yes"):
return True
if ok in ("n", "no","nop", "nope"):
return False
retries -= 1
if(retries) < 0:
raise ValueError("invalid user response")
print(reminder)
# 不填prompt會直接跳出
>>> sayOk()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
sayOk()
TypeError: sayOk() missing 1 required positional argument: 'prompt'
# 至少填一個,剩下為空會賦默認(rèn)值
>>> sayOk("are you quit?")
are you quit?
try again!
are you quit?y
True
# 也可以都填
>>> sayOk("are you OK?",3,"say!you 倒是 say啊, 就say個yes或者no!")
are you OK?
say!you 倒是 say啊, 就say個yes或者no!
are you OK?no
False
參數(shù)累積
# 當(dāng)默認(rèn)值是可變參數(shù)時,會在后續(xù)調(diào)用中傳遞給它的參數(shù)累積
>>> def fun(a, List = []):
List.append(a)
return List
>>> print(fun(1))
[1]
>>> print(fun(2))
[1, 2]
>>> print(fun(3))
[1, 2, 3]
# 除非每次都置空
def fun(a, list=None):
if list is None:
list = []
list.append(a)
return list
print(fun(1))
print(fun(2))
print(fun(3))
[1]
[2]
[3]
關(guān)鍵字參數(shù)
關(guān)鍵詞參數(shù)的好處在于,不需要按照定義的順序去傳參。
# 4個參數(shù)
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
# 關(guān)鍵詞參數(shù),順序不同,結(jié)果相同
parrot(voltage=1000000, action='VOOOOOM')
parrot(action='VOOOOOM', voltage=1000000)
# 沒有關(guān)鍵詞參數(shù),會按照入?yún)㈨樞蚺帕?parrot('a million', 'bereft of life', 'jump')
無效的情況
parrot() # 沒有請求參數(shù)
parrot(voltage=5.0, 'dead') # 關(guān)鍵字參數(shù)后面不能跟非關(guān)鍵字參數(shù)
parrot(110, voltage=220) # 會被判為相同參數(shù),導(dǎo)致重復(fù)
parrot(actor='John Cleese') # 參數(shù)錯誤導(dǎo)致的未知參數(shù)
可變參數(shù)列表
一般的可變參數(shù)列表,不限數(shù)量,不限格式
>>> def concat(*args, sep="/"):
return sep.join(args)
>>> concat("one","two","three")
'one/two/three'
>>> concat("one","two","three",sep=" .")
'one .two .three'
復(fù)雜的例子
# *name必須在**name的前面
>>> def cheeseshop(kind, *args, **keywords):
print("--你這有",kind,"嗎?")
print("--有,",kind,"是我們的招牌,咋能沒有么!")
for arg in args:
print(arg)
print("-" * 40)
for key in keywords:
print(key,":",keywords[key])
# 輸出
# 關(guān)鍵字參數(shù)的順序和函數(shù)調(diào)用的順序相同
>>> cheeseshop("肉夾饃","可好吃啦!全是肉","給我拿兩個", laoban="陜西人", client="南方人")
# 結(jié)果
--你這有 肉夾饃 嗎?
--有, 肉夾饃 是我們的招牌,咋能沒有么!
可好吃啦!全是肉
給我拿兩個
----------------------------------------
laoban : 陜西人
client : 南方人