【本文的我遥倦,是一個文科財務工作者撤缴。在單位信息化全靠人做的年代鞍帝,確實工作壓力大也忙不過來幻工。9102年的我巫延,深感不學習點新知識遲早要被淘汰。所以今天開始記錄自己的python小白筆記地消,各位見笑炉峰。】
編程基礎(chǔ)部分筆記:《python編程快速上手-讓繁瑣工作自動化》脉执,AI Sweigart疼阔,人民郵電出版社
day4 python編程基礎(chǔ)(2)
CH3 函數(shù)
1.自定義函數(shù)
def hello():
print('Howdy!')
print('Howdy!!!')
print('Hello there.')
hello()
第一行是 def 語句,它定義了一個名為 hello()的函數(shù)半夷。 def 語句之后的代碼塊是函數(shù)體婆廊。這段代碼在函數(shù)調(diào)用時執(zhí)行,而不是在函數(shù)第一次定義時執(zhí)行巫橄。函數(shù)之后的 hello()語句行是函數(shù)調(diào)用淘邻。
(1)def 語句和參數(shù)
如果調(diào)用 print()或 len()函數(shù), 你會傳入一些值湘换,放在括號之間宾舅, 在這里稱為“參數(shù)”。有一個名為 name 的變元?彩倚〕镂遥“變元” 是一個變量, 當函數(shù)被調(diào)用時帆离, 參數(shù)就存放在其中蔬蕊。
def hello(name):
print('Hello ' + name)
hello('Alice')
hello('Bob')
(2)返回值和 return 語句
用 def 語句創(chuàng)建函數(shù)時, 可以用 return 語句指定應該返回什么值盯质。
import random
def getAnswer(answerNumber):
if answerNumber == 1:
return 'It is certain'
else:
return 'Very doubtful'
r = random.randint(1, 9)
fortune = getAnswer(r)
print(fortune)
請注意袁串,因為可以將返回值作為參數(shù)傳遞給另一個函數(shù)調(diào)用,所以你可以將最后三行縮寫成一行等價的代碼:
print(getAnswer(random.randint(1, 9)))
(3)None 值
如果你希望變量中存儲的東西不會與一個真正的值混淆呼巷,這個沒有值的值就可能有用囱修。有一個使用 None 的地方就是 print()的返回值。 print()函數(shù)在屏幕上顯示文本王悍, 但它不需要返回任何值破镰,那么 print()就返回 None。
(4)關(guān)鍵字參數(shù)和 print()
這兩個字符串出現(xiàn)在獨立的兩行中压储,因為 print()函數(shù)自動在傳入的字符串末尾添加了換行符鲜漩。但是,可以設(shè)置 end 關(guān)鍵字參數(shù)集惋,將它變成另一個字符串孕似。
print('Hello', end='')
print('World')
HelloWorld
傳入 sep 關(guān)鍵字參數(shù), 替換掉默認的分隔字符串(空格)刮刑。在交互式環(huán)境中輸入以下代碼:
print('cats', 'dogs', 'mice', sep=',')
cats,dogs,mice
2.全局變量和局部變量
處于局部作用域的變量喉祭,被稱為“局部變量”养渴。處于全局作用域的變量,被稱為“全局變量”泛烙。
雖然在小程序中使用全局變量沒有太大問題理卑,但當程序變得越來越大時, 依賴全局變量就是一個壞習慣蔽氨。
重要原則:
- 全局作用域中的代碼不能使用任何局部變量藐唠;
- 但是,局部作用域可以訪問全局變量鹉究;
- 一個函數(shù)的局部作用域中的代碼宇立,不能使用其他局部作用域中的變量。
- 如果在不同的作用域中坊饶,你可以用相同的名字命名不同的變量泄伪。也就是說殴蓬,可以有一個名為 spam 的局部變量匿级,和一個名為 spam 的全局變量。
(1)global 語句
如果需要在一個函數(shù)內(nèi)修改全局變量染厅,就使用 global 語句痘绎。如果在函數(shù)的頂部有 global eggs 這樣的代碼
(2)異常處理
錯誤可以由 try 和 except 語句來處理。那些可能出錯的語句被放在 try 子句中肖粮。如果錯誤發(fā)生孤页,程序執(zhí)行就轉(zhuǎn)到接下來的 except 子句開始處∩荩可以將前面除數(shù)為零的代碼放在一個 try 子句中行施,讓 except 子句包含代碼,來處理該錯誤發(fā)生時應該做的事魂那。
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
ch4 列表
1.列表數(shù)據(jù)類型
列表”是一個值蛾号, 它包含多個字構(gòu)成的序列。列表值看起來像這樣: ['cat', 'bat', 'rat', 'elephant']涯雅。
(1)用下標取得列表中的單個值
列表也可以包含其他列表值鲜结。這些列表的列表中的值,可以通過多重下標來訪問活逆,第一個下標表明使用哪個列表值精刷,第二個下標表明該列表值中的值。 像這樣:
>>> spam = [['cat', 'bat'], [10, 20, 30, 40, 50]]
>>> spam[0][1]
'bat'
>>> spam[1][4]
50
(2)負數(shù)下標
整數(shù)值?1 指的是列表中的最后一個下標蔗候, ?2 指的是列表中倒數(shù)第二個下標怒允, 以此類推。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[-1]
'elephant'
(3)利用切片取得子列表
“切片”可以從列表中取得多個值锈遥,結(jié)果是一個新列表纫事。
spam[1:4]是一個列表和切片(兩個整數(shù))仰美。第一個整數(shù)是切片開始處的下標。第二個整數(shù)是切片結(jié)束處的下標儿礼。切片向上增長咖杂,直至第二個下標的值,但不包括它蚊夫。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[1:3]
['bat', 'rat']
>>> spam[0:-1]
['cat', 'bat', 'rat']
作為快捷方法诉字,你可以省略切片中冒號兩邊的一個下標或兩個下標。省略第一個下標相當于使用 0知纷, 或列表的開始壤圃。省略第二個下標相當于使用列表的長度, 意味著分片直至列表的末尾琅轧。
>>> spam[1:]
['bat', 'rat', 'elephant']
(4)用下標改變列表中的值
也可以使用列表的下標來改變下標處的值伍绳。例如, spam[1] = 'aardvark'意味著“將列表 spam 下標 1 處的值賦值為字符串'aardvark'乍桂。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[1] = 'aardvark'
>>> spam
['cat', 'aardvark', 'rat', 'elephant']
(5)列表連接和列表復制
+操作符可以連接兩個列表冲杀, 得到一個新列表,*操作符可以用于一個列表和一個整數(shù)睹酌,實現(xiàn)列表的復制权谁。
>>> [1, 2, 3] + ['A', 'B', 'C']
[1, 2, 3, 'A', 'B', 'C']
>>> ['X', 'Y', 'Z'] * 3
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z']
>>> spam = [1, 2, 3]
>>> spam = spam + ['A', 'B', 'C']
>>> spam
[1, 2, 3, 'A', 'B', 'C']
(6)用 del 語句從列表中刪除值
del 語句將刪除列表中下標處的值, 表中被刪除值后面的所有值憋沿, 都將向前移動一個下標旺芽。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat']
(7)用 len()取得列表的長度
len()函數(shù)將返回傳遞給它的列表中值的個數(shù), 就像它能計算字符串中字符的個數(shù)一樣辐啄。
>>> spam = ['cat', 'dog', 'moose']
>>> len(spam)
3
2.使用列表
使用列表的好處在于采章,現(xiàn)在數(shù)據(jù)放在一個結(jié)構(gòu)中,所以程序能夠更靈活的處理數(shù)據(jù)壶辜,比放在一些重復的變量中方便悯舟。
(1)列表用于循環(huán)
一個常見的 Python 技巧, 是在 for 循環(huán)中使用 range(len(someList))士复, 迭代列表的每一個下標图谷。
>>> supplies = ['pens', 'staplers', 'flame-throwers', 'binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
Index 0 in supplies is: pens
Index 1 in supplies is: staplers
Index 2 in supplies is: flame-throwers
Index 3 in supplies is: binders
(2)in 和 not in 操作符
利用 in 和 not in 操作符, 可以確定一個值否在列表中阱洪。 連接兩個值: 一個要在列表中查找的值便贵, 以及待查找的列表。這些表達式將求值為布爾值冗荸。
>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
(3)多重賦值技巧
多重賦值技巧是一種快捷方式承璃,讓你在一行代碼中,用列表中的值為多個變量賦值蚌本。
>>> cat = ['fat', 'black', 'loud']
>>> size, color, disposition = cat
(4)增強的賦值操作
針對+盔粹、 -隘梨、 *、 /和%操作符舷嗡, 都有增強的賦值操作符轴猎, 如表 4-1 所示。
3.方法
(1)用 index()方法在列表中查找值
列表值有一個 index()方法进萄, 可以傳入一個值捻脖, 如果該值存在于列表中, 就返回它的下標中鼠。如果該值不在列表中可婶, Python 就報 ValueError。如果列表中存在重復的值援雇,就返回它第一次出現(xiàn)的下標矛渴。
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> spam.index('hello')
0
>>> spam.index('howdy howdy howdy')
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
spam.index('howdy howdy howdy')
ValueError: 'howdy howdy howdy' is not in list
(2)用 append()和 insert()方法在列表中添加值
要在列表中添加新值, 就使用 append()和 insert()方法惫搏。前面的 append()方法調(diào)用具温, 將參數(shù)添加到列表末尾。 insert()方法可以在列表任意下標處插入一個值晶府。 insert()方法的第一個參數(shù)是新值的下標桂躏, 第二個參數(shù)是要插入的新值钻趋。
>>> spam = ['cat', 'dog', 'bat']
>>> spam.append('moose')
>>> spam
['cat', 'dog', 'bat', 'moose']
>>> spam = ['cat', 'dog', 'bat']
>>> spam.insert(1, 'chicken')
>>> spam
['cat', 'chicken', 'dog', 'bat']
請注意川陆, 代碼是 spam.append('moose')和 spam.insert(1, 'chicken'),而不是 spam =spam.append('moose')和 spam = spam.insert(1, 'chicken')蛮位。
方法屬于單個數(shù)據(jù)類型较沪。 append()和 insert()方法是列表方法, 只能在列表上調(diào)用失仁, 不能在其他值上調(diào)用尸曼,
(3)用 remove()方法從列表中刪除值
給 remove()方法傳入一個值,它將從被調(diào)用的列表中刪除萄焦。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam.remove('bat')
>>> spam
['cat', 'rat', 'elephant']
如果該值在列表中出現(xiàn)多次控轿,只有第一次出現(xiàn)的值會被刪除。
如果知道想要刪除的值在列表中的下標拂封, del 語句就很好用茬射。如果知道想要從列表中刪除的值, remove()方法就很好用冒签。
(4)用 sort()方法將列表中的值排序
數(shù)值的列表或字符串的列表在抛, 能用 sort()方法排序。也可以指定 reverse 關(guān)鍵字參數(shù)為 True萧恕, 讓 sort()按逆序排序刚梭。
>>> spam = ['ants', 'cats', 'dogs', 'badgers', 'elephants']
>>> spam.sort()
>>> spam
['ants', 'badgers', 'cats', 'dogs', 'elephants']
>>> spam.sort(reverse=True)
>>> spam
['elephants', 'dogs', 'cats', 'badgers', 'ants']
關(guān)于 sort()方法肠阱,你應該注意 3 件事。
- 首先朴读, sort()方法當場對列表排序屹徘。不要寫出 spam = spam.sort()這樣的代碼,試圖記錄返回值衅金。
- 其次缘回,不能對既有數(shù)字又有字符串值的列表排序,因為 Python 不知道如何比較它們典挑。
- 第三酥宴, sort()方法對字符串排序時, 使用“ASCII 字符順序”您觉, 而不是實際的字典順序拙寡。這意味著大寫字母排在小寫字母之前。因此在排序時琳水, 小寫的 a 在大寫的Z 之后肆糕。
5.類似列表的類型:字符串和元組
列表并不是唯一表示序列值的數(shù)據(jù)類型。例如在孝,字符串和列表實際上很相似诚啃,只要你認為字符串是單個文本字符的列表。對列表的許多操作私沮,也可以作用于字符串:按下標取值始赎、 切片、用于 for 循環(huán)仔燕、 用于 len()造垛, 以及用于 in 和 not in 操作符。
(1)可變和不可變數(shù)據(jù)類型
但列表和字符串在一個重要的方面是不同的晰搀。列表是“可變的”數(shù)據(jù)類型五辽,它的值可以添加、刪除或改變外恕。但是杆逗,字符串是“不可變的”, 它不能被更改鳞疲。
(2)元組數(shù)據(jù)類型
首先罪郊,元組輸入時用圓括號(), 而不是用方括號[]建丧。
但元組與列表的主要區(qū)別還在于排龄,元組像字符串一樣,是不可變的。 元組不能讓它們的值被修改橄维、添加或刪除尺铣。
如果元組中只有一個值,你可以在括號內(nèi)該值的后面跟上一個逗號争舞, 表明這種情況凛忿。 否則, Python 將認為竞川, 你只是在一個普通括號內(nèi)輸入了一個值店溢。
(3)用 list()和 tuple()函數(shù)來轉(zhuǎn)換類型
函數(shù) list()和 tuple()將返回傳遞給它們的值的列表和元組版本。
>>> tuple(['cat', 'dog', 5])
('cat', 'dog', 5)
>>> list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
如果需要元組值的一個可變版本委乌,將元組轉(zhuǎn)換成列表就很方便床牧。
(4)引用
A.copy 模塊的 copy()和 deepcopy()函數(shù)
在處理列表和字典時,盡管傳遞引用常常是最方便的方法遭贸,但如果函數(shù)修改了傳入的列表或字典戈咳,你可能不希望這些變動影響原來的列表或字典。要做到這一點壕吹,Python 提供了名為 copy 的模塊著蛙, 其中包含 copy()和 deepcopy()函數(shù)。第一個函數(shù)copy.copy()耳贬, 可以用來復制列表或字典這樣的可變值踏堡, 而不只是復制引用。在交互式環(huán)境中輸入以下代碼:
>>> import copy
>>> spam = ['A', 'B', 'C', 'D']
>>> cheese = copy.copy(spam)
>>> cheese[1] = 42
>>> spam
['A', 'B', 'C', 'D']
>>> cheese
['A', 42, 'C', 'D']
如果要復制的列表中包含了列表咒劲, 那就使用 copy.deepcopy()函數(shù)來代替顷蟆。deepcopy()函數(shù)將同時復制它們內(nèi)部的列表。