標籤:value AC 浮點 typeerror instance 命名 產生 不可變 表示
list:a=[1,2,3] list值可變
tuple:b=(1,2,3) tuple值不可變
dict:c={‘a‘:1,‘b‘:2,‘c‘:3} dict(key-value)key不可變
讀取c:c[‘a‘]
set:d=set([1,2,3]) set(key)無value key為傳入一個list
range(5)產生的序列是從0開始小於5的整數:
>>> list(range(5))
[0, 1, 2, 3, 4]
在Python中,定義一個函數要使用def語句
只允許整數和浮點數類型的參數。資料類型檢查可以用內建函數isinstance()實現:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError(‘bad operand type‘)
if x >= 0:
return x
else:
return -x
預設參數:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
調用power()時就可以只有一個參數了,n預設2
坑:
def add_end(L=[]):
L.append(‘END‘)
return L
>>> add_end()
[‘END‘]
但是,再次調用add_end()時,結果就不對了:
>>> add_end()
[‘END‘, ‘END‘]
>>> add_end()
[‘END‘, ‘END‘, ‘END‘]
原因解釋如下:
Python函數在定義的時候,預設參數L的值就被計算出來了,即[],因為預設參數L也是一個變數,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,預設參數的內容就變了,不再是函數定義時的[]了。
!!!定義預設參數要牢記一點:預設參數必須指向不變對象!
修改:def add_end(L=None):
if L is None:
L = []
L.append(‘END‘)
return L
可變參數:def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
在number前加了個* ,沒有*的話可以傳入list或者tuple
加了*就是接受tuple
當有一個nums = [1, 2, 3]
可以 calc(nums[0], nums[1], nums[2])
這樣繁瑣:可這樣:calc(*nums)
*nums表示把nums這個list或者tuple的所有元素作為可變參數傳進去
關鍵字參數:
def person(name, age, **kw):
print(‘name:‘, name, ‘age:‘, age, ‘other:‘, kw)
關鍵字kw擴充函數的功能,和可變參數類似,也可以先組裝出一個dict,然後,把該dict轉換為關鍵字參數傳進:
>>> extra = {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}
>>> person(‘Jack‘, 24, city=extra[‘city‘], job=extra[‘job‘])
name: Jack age: 24 other: {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}
簡化寫法:
>>> extra = {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}
>>> person(‘Jack‘, 24, **extra)
name: Jack age: 24 other: {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}在dict前面加兩個**,**extra表示把extra這個dict的所有key-value用關鍵字參數傳入到函數的**kw參數,kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函數外的extra。
命名關鍵字參數:
檢查傳入的關鍵字
def person(name, age, **kw):
if ‘city‘ in kw:
# 有city參數
pass
if ‘job‘ in kw:
# 有job參數
pass
print(‘name:‘, name, ‘age:‘, age, ‘other:‘, kw)但是調用者仍可以傳入不受限制的關鍵字參數
要想限制關鍵字,要命名關鍵字參數,只接收city和job作為關鍵字參數:
def person(name, age, *, city, job):
print(name, age, city, job)
和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔字元*,*後面的參數被視為命名關鍵字參數。
如果函數定義中已經有了一個可變參數,後面跟著的命名關鍵字參數就不再需要一個特殊分隔字元*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
參數組合:
定義函數時可以用必選參數、預設參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。
切片:
>>> L = [‘Michael‘, ‘Sarah‘, ‘Tracy‘, ‘Bob‘, ‘Jack‘]
>>> r = []
>>> n = 3
>>> for i in range(n):
... r.append(L[i])
...
>>> r
[‘Michael‘, ‘Sarah‘, ‘Tracy‘]
range(n)產生0到n-1的整數
切片(Slice)操作符:
>>> L[0:3]
[‘Michael‘, ‘Sarah‘, ‘Tracy‘]
從0開始到3(不包括3索引)即0,1,2 如果第一個索引是0,還可以省略:L[:3]
L[-1]取倒數第一個元素
列: L = list(range(100))
前10個數:
>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
後10個數:
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
前11-20個數:
>>> L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
前10個數,每兩個取一個:
>>> L[:10:2]
[0, 2, 4, 6, 8]
所有數,每5個取一個:
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
甚至什麼都不寫,唯寫[:]就可以原樣複製一個list:
>>> L[:]
[0, 1, 2, 3, ..., 99]
tuple也是一種list,唯一區別是tuple不可變。因此,tuple也可以用切片操作,只是操作的結果仍是tuple:
>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)
字串‘xxx‘也可以看成是一種list,每個元素就是一個字元。因此,字串也可以用切片操作,只是操作結果仍是字串:
>>> ‘ABCDEFG‘[:3]
‘ABC‘
>>> ‘ABCDEFG‘[::2]
‘ACEG‘
Python每日學習筆記