十分鐘入門(mén) Python 教程
題記
去年和 amile 童鞋定了個(gè)小目標(biāo),決定帶著點(diǎn)興趣和熱情,順著全民學(xué) Python 的熱潮,隨波逐流。奈何二零二零年是真的魔幻,唉,生活有你讀不懂的詩(shī),還有到不了的遠(yuǎn)方,我把那一年的辛酸過(guò)往,閹割成了一首詩(shī)?!吧钏埔槐嗖瑁氯缡潘话?,邂逅一縷禪香,無(wú)數(shù)個(gè)赤夜里,抬頭望見(jiàn)新月,繁星點(diǎn)點(diǎn)。“,好像還可以再閹割下,就變成了“苦茶,逝水,禪香,赤夜,新月,繁星”六個(gè)意象。而今,擠擠時(shí)間把這件事進(jìn)行下去吧。。。。。。
準(zhǔn)備
本文參考的教材是《Python 教程:從入門(mén)到實(shí)踐》,這本書(shū)比較基礎(chǔ),對(duì)沒(méi)有編程經(jīng)驗(yàn)的讀者異常友好,所以本教程適用于對(duì)剛剛開(kāi)始學(xué)或者沒(méi)有編程經(jīng)驗(yàn)的讀者。使用jupyter notebook作為學(xué)習(xí)這門(mén)語(yǔ)言入門(mén)的工具,這玩意好使,免去了初學(xué)者學(xué)習(xí)編輯器的成本,打開(kāi)網(wǎng)頁(yè)編寫(xiě) Python 程序,點(diǎn)擊運(yùn)行即可出結(jié)果,而且它除了可以寫(xiě) Python 之外,還支持 Markdown 語(yǔ)法,所以很適合寫(xiě)教程和筆記的。關(guān)于它的安裝教程,可以看下這篇文章:https://zhengjiangtao.cn/a2python/base/env.html
給它一個(gè)特寫(xiě)。

那個(gè)經(jīng)典的“Hello World”
在 Python 語(yǔ)言中,我們可以通過(guò)print函數(shù)去打印相關(guān)的信息,比如說(shuō)在 Python3 中我們要打印出一個(gè)Hello World,可以這樣寫(xiě)。
#?encoding:?utf-8
if?__name__?==?'__main__':
????print('Hello?World')
基礎(chǔ)知識(shí)梳理
如樓上的 Hello World 所示,在 Python 語(yǔ)言中,末尾是不用加分號(hào)的。Python 是一門(mén)解釋型,它并不像 C、C++這樣,需要有個(gè)編譯的過(guò)程,將代碼編譯成機(jī)器碼(轉(zhuǎn)換成計(jì)算機(jī)可識(shí)別的二進(jìn)制指令)然后運(yùn)行,在編譯過(guò)程中要確定變量的類型,通不過(guò)編譯就不能運(yùn)行。Python 語(yǔ)言需要一個(gè)解釋器,邊解釋邊運(yùn)行,所以在定義變量的時(shí)候并不需要指出其是什么類型,遵循變量名 = 變量值這種方式即可,關(guān)于變量名的規(guī)范和其它語(yǔ)言也差不多,這里就不展開(kāi)贅述了,后面的相關(guān)類型的變量賦值本身是沒(méi)有什么好講的,但是 Python 語(yǔ)言有意思就有意思在它的庫(kù)多,你不用洋洋灑灑寫(xiě)很多,你只要庫(kù)調(diào)的好,代碼是非常簡(jiǎn)潔的。
字符串
比如說(shuō)我們要定義一個(gè)字符串變量名name為ataola,就可以寫(xiě)作name = 'ataola'。如果說(shuō)字符串很長(zhǎng),我們期望原樣輸出,那么可以這樣寫(xiě)。
long_str?=?'''The?Zen?of?Python,?by?Tim?Peters
Beautiful?is?better?than?ugly.
Explicit?is?better?than?implicit.
Simple?is?better?than?complex.
Complex?is?better?than?complicated.
Flat?is?better?than?nested.
Sparse?is?better?than?dense.
Readability?counts.
Special?cases?aren't?special?enough?to?break?the?rules.
Although?practicality?beats?purity.
Errors?should?never?pass?silently.
Unless?explicitly?silenced.
In?the?face?of?ambiguity,?refuse?the?temptation?to?guess.
There?should?be?one--?and?preferably?only?one?--obvious?way?to?do?it.
Although?that?way?may?not?be?obvious?at?first?unless?you're?Dutch.
Now?is?better?than?never.
Although?never?is?often?better?than?*right*?now.
If?the?implementation?is?hard?to?explain,?it's?a?bad?idea.
If?the?implementation?is?easy?to?explain,?it?may?be?a?good?idea.
Namespaces?are?one?honking?great?idea?--?let's?do?more?of?those!'''
print(long_str)
注意: 變量的命名不能跟系統(tǒng)的函數(shù)名,或者保留字沖突,比如這里你寫(xiě)作str = 'what's wrong with you ?'就很不好,因?yàn)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">str是系統(tǒng)函數(shù),它可以把變量轉(zhuǎn)成字符串類型。例如樓下這個(gè)例子,如果不用str函數(shù)將整型變量age轉(zhuǎn)換成字符串類型的話,就會(huì)出現(xiàn)運(yùn)行出錯(cuò),因?yàn)樗麄儾皇且粋€(gè)類型的變量。
age?=?24
msg=?"i?am?"?+?str(age)?+?"?year?old"
print(msg)
一些常用的字符串 API
title: 首字母大寫(xiě)upper: 大寫(xiě)lower: 小寫(xiě)strip: 去空lstrip: 左邊去空rstrip: 右邊去空split: 字符串轉(zhuǎn)列表count: 統(tǒng)計(jì)字符出現(xiàn)的次數(shù)
例子 1
代碼:
_str?=?'hello?world'
print('首字母大寫(xiě):',?_str.title())
print('大寫(xiě):',?_str.upper())
print('小寫(xiě):',?_str.lower())
輸出:
首字母大寫(xiě):?Hello?World
大寫(xiě):HELLO WORLD
小寫(xiě):hello world
例子 2
代碼:
_str?=?'?happy?everyday??'
print('|'?+?_str?+?'|')
print('|'?+?_str.strip()?+?'|')
print('|'?+?_str.lstrip()?+?'|')
print('|'?+?_str.rstrip()?+?'|')
print('|'?+?_str.lstrip().rstrip()?+?'|')
輸出:
|?happy?everyday??|
|happy?everyday|
|happy?everyday??|
|?happy?everyday|
|happy?everyday|
例子 3
代碼:
bio?=?'day?day?up,?to?be?strong!'
print(bio.count('day'))
print(bio.count('up'))
輸出:
2
1
由例子 2 的最后一行可見(jiàn) Python 是支持函數(shù)鏈?zhǔn)秸{(diào)用的。
整型
python3 的整型范圍是無(wú)限的,所以它特別適合拿來(lái)做科學(xué)計(jì)算相關(guān)的,因?yàn)槟悴挥脫?dān)心它會(huì)精度溢出。有意思的是,它允許你用_下劃線表示數(shù)字的分隔符,提高其可讀性,這并不影響其數(shù)值,比如1_000,它和1000是一樣的。
一些常用處理數(shù)字的 API
bin: 轉(zhuǎn)二進(jìn)制abs: 求絕對(duì)值bool: 轉(zhuǎn)布爾值float: 轉(zhuǎn)浮點(diǎn)數(shù)pow: 冪函數(shù)一些位運(yùn)算。。。。。。
例子 4
代碼:
print(bin(8))?#?十進(jìn)制轉(zhuǎn)二進(jìn)制
print(abs(-10))?#?絕對(duì)值
print(?1?and?0?==?1?&?0)?#?按位于
print?((1?or?0)?==?(1?|?0))?#?按位或
print(~11?==?-12)#?取反(二進(jìn)制的負(fù)數(shù)表示方法:正數(shù)按位取反再加1)
print(2?^?3?^?2?==?3)?#?異或
print(8?<1?==16)?#?左移
print(8?>>?1?==?4)?#?右移
print(10?%?3?==?1)?#?取余
print(3?**?2?==?pow(3,?2))?#?次方運(yùn)算符?和?冪函數(shù)
print(bool(1)?==?True?)?#?轉(zhuǎn)布爾類型,除0外都是True
print(bool(0)?==?True?)?#?轉(zhuǎn)布爾類型,除0外都是True
print(float(100))?#?整數(shù)轉(zhuǎn)浮點(diǎn)
輸出:
0b1000
10
True
True
True
True
True
True
True
True
True
False
100.0
浮點(diǎn)
為什么0.1 + 0.2 != 0.3, 3 * 0.1 != 0.3, 而是0.30000000000000004?
我們知道計(jì)算機(jī)只能識(shí)別二進(jìn)制,所以浮點(diǎn)數(shù)會(huì)被轉(zhuǎn)換成二進(jìn)制,0.1 轉(zhuǎn)成二進(jìn)制是0.0001100110011001100110011001100110011001100110011001101, 0.2 轉(zhuǎn)成二進(jìn)制是0.001100110011001100110011001100110011001100110011001101,相加得到的結(jié)果是0.0100110011001100110011001100110011001100110011001101. 簡(jiǎn)單的說(shuō)就是像 0.1 這種無(wú)法被二進(jìn)制完整表示。
這里我們可以通過(guò)round(num, digits)去使結(jié)果符合預(yù)期,例如print(round(0.1 + 0.2, 1)),就能得到 0.3
注意:
十進(jìn)制整數(shù)轉(zhuǎn)二進(jìn)制方法:除 2 取余;十進(jìn)制小數(shù)轉(zhuǎn)二進(jìn)制方法:乘 2 除整
布爾值
在 Python 中,用True表示真,用False表示假,注意這里是區(qū)分大小寫(xiě)的。
我們來(lái)看下面這個(gè)例子
例子 5
代碼:
print(1?==?True)?#?True
print(0?==?False)?#?False
print(''?==?True)?#?False
print('?'?==?True)?#?False
print(''?==?False)?#?False
print('?'?==?False)?#?False
print(bool(''))?#?False
print(bool('?'))?#?True
可以看到在 Python 中,數(shù)字 0 也可以表示 False,其它數(shù)字可以表示 True, 而字符串它不能表示成真或假,但是可以通過(guò)bool函數(shù)將其轉(zhuǎn)回成真假
列表
列表是一系列按特定順序排列的元素組成,類似于 Javascript 中的數(shù)組。值得一提的是,在列表訪問(wèn)的時(shí)候,它的索引下標(biāo)可以為負(fù)數(shù),例如a[-1]就是表示列表 a 中的倒數(shù)第一個(gè)元素
一些常用的列表 API
sort: 排序reverse: 反轉(zhuǎn)len: 長(zhǎng)度append: 從列表末尾插入元素insert: 列表任意位置插入元素pop: 從列表末尾彈出元素remove: 從右往左移除第一個(gè)遇到的目標(biāo)元素
我們一起來(lái)看下面這個(gè)例子,
例子 5
代碼:
season??=?['spring',?'summer',?'autumn',?'winter']
print(season)
season.sort()
print(season)
season.sort(reverse=True)
print(season)
print(sorted(season))
print(season)
season.reverse()
print(season)
print(len(season))
輸出:
['spring',?'summer',?'autumn',?'winter']
['autumn',?'spring',?'summer',?'winter']
['winter',?'summer',?'spring',?'autumn']
['autumn',?'spring',?'summer',?'winter']
['winter',?'summer',?'spring',?'autumn']
['autumn',?'spring',?'summer',?'winter']
4
從樓上的例子,我們不難發(fā)現(xiàn),通過(guò)list.sort(),這種方式它會(huì)改變列表的原值,而且在函數(shù)中可以傳一個(gè)參數(shù)reverse來(lái)表示是順著排序還是倒著排序。
我們?cè)賮?lái)看一個(gè)例子
例子 6
代碼:
arr?=?[1,?2,?3,?4,?5]
print(arr[0])
print(arr[-1])
arr.append(6)
print(arr)
arr.insert(4,?4.5)
print(arr)
del?arr[4]
print(arr)
arr.pop()
print(arr)
arr.pop(2)
print(arr)
arr.remove(4)
print(arr)
輸出:
1
5
[1,?2,?3,?4,?5,?6]
[1,?2,?3,?4,?4.5,?5,?6]
[1,?2,?3,?4,?5,?6]
[1,?2,?3,?4,?5]
[1,?2,?4,?5]
[1,?2,?5]
樓上的例子首先我定義了一個(gè)列表arr = [1, 2, 3, 4, 5],然后我去訪問(wèn)了它的第一個(gè)元素和最后一個(gè)元素,接著我通過(guò)append函數(shù)在列表后面追加了6,之后我又通過(guò)insert函數(shù)在第五個(gè)元素的位置插入了4.5,緊接著我用del又把它刪除了,然后我通過(guò)調(diào)用pop彈出了列表最后的元素,之后我又給它穿了個(gè)參數(shù)2,表示將第三個(gè)元素彈出,最后我通過(guò)remove函數(shù)去刪除了從列表最后往前找到的第一個(gè)目標(biāo)元素。
字典
字典是一系列的鍵值對(duì),類似于 JavaScript 中的對(duì)象。我們還是以具體的示例來(lái)看下。
例子 7
代碼:
user?={?'name':?'ataola',?'age':?24,?'sex':?'男'?}
print(user)
print('Hello?',?user['name'])
輸出:
{'name':?'ataola',?'age':?24,?'sex':?'男'}
Hello??ataola
這里我們定義了一個(gè)用戶信息的字典,然后試著把它打印出來(lái),通過(guò)鍵值對(duì)的鍵可以訪問(wèn)它的值,接著我們?cè)囍鴺?gòu)造字符串去試著訪問(wèn)它。
例子 8
代碼:
for?key,?value?in?user.items():
????print(key,?value)
輸出:
name?ataola
age?24
sex?男
上面這個(gè)例子就是遍歷字典的鍵值對(duì)的方法。
如果我只是想遍歷它的鍵或者值呢?通過(guò)keys()表示鍵,通過(guò)values()表示值。
代碼:
for?key?in?user.keys():
????print(key)
輸出:
name
age
sex
代碼:
for?value?in?user.values():
????print(value)
輸出:
ataola
24
男
這里再進(jìn)一步思考下,如果說(shuō)我遍歷的值有很多重復(fù)呢?我怎么讓它不重復(fù)呢?嗯,對(duì),答案就是集合去重。當(dāng)然,這里答案不唯一。
代碼:
favorite_language?=?{?'alice':?'JAVA',?'Bob':?'C++',?'ataola':?'Javascript',?'daming':?'Javascript',?'wuyifan':?'Javascript'?}
for?value?in?set(favorite_language.values()):
????print(value)
輸出:
JAVA
Javascript
C++
循環(huán)和判斷
這里把循環(huán)和判斷放在一起講吧,循環(huán)在大多數(shù)編程語(yǔ)言里都差不多,不外乎for循環(huán)和while循環(huán),條件判斷也都類似,不外乎if,else這種。
while 循環(huán)
代碼:
while?message?!=?'quit':
????message?=?input('please?input?something:')
????print(message)
輸出:
please?input?something:11
11
please?input?something:22
22
please?input?something:33
33
please?input?something:quit
quit
這個(gè)程序是這樣子的,當(dāng)用戶輸入quit的時(shí)候,那么我就退出這個(gè)程序,不然我就原樣輸出。
條件判斷
代碼:
num?=?input('please?input?a?number:?')
num?=?int(num)
if?num?>?10:
????print('big')
elif?num?<=?10?and?num?>?5:
????print('normal')
else:
????print('small')
輸出:
please?input?a?number:?8
normal
這個(gè)程序是這樣子的,提示用戶輸入一個(gè)數(shù),然后判斷這個(gè)數(shù)的大小,通過(guò)if,elif,else來(lái)判斷輸入的數(shù)是大還是小,抑或是正常,這就是個(gè)例子,本身沒(méi)有什么意義。
for 循環(huán)
代碼:
numbers?=?list(range(1,?20))
for?num?in?numbers:
????if?num?%?2?==?0:
????????print(num,?'是個(gè)偶數(shù)')
????else:
????????print(num,?'是個(gè)奇數(shù)')
print(numbers)
輸出:
1?是個(gè)奇數(shù)
2?是個(gè)偶數(shù)
3?是個(gè)奇數(shù)
4?是個(gè)偶數(shù)
5?是個(gè)奇數(shù)
6?是個(gè)偶數(shù)
7?是個(gè)奇數(shù)
8?是個(gè)偶數(shù)
9?是個(gè)奇數(shù)
10?是個(gè)偶數(shù)
11?是個(gè)奇數(shù)
12?是個(gè)偶數(shù)
13?是個(gè)奇數(shù)
14?是個(gè)偶數(shù)
15?是個(gè)奇數(shù)
16?是個(gè)偶數(shù)
17?是個(gè)奇數(shù)
18?是個(gè)偶數(shù)
19?是個(gè)奇數(shù)
[1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19]
樓上的這個(gè)例子,我們用了一個(gè) for 循環(huán)遍歷了列表 numbers 里面的項(xiàng),然后結(jié)合 if 判斷這個(gè)項(xiàng)是奇數(shù)還是偶數(shù)。
函數(shù)
函數(shù)本質(zhì)是帶名字的代碼段,在 python 中我們可以通過(guò)def去定義一個(gè)函數(shù)。
代碼:
def?sayHello(name?=?'zjt'):
????return?'hello?'?+?name
for?i?in?range(1,?10):
????if?i?%?2?==?0:
????????print(i,?sayHello())
????else:
????????print(i,?sayHello('ataola'))
輸出
1?hello?ataola
2?hello?zjt
3?hello?ataola
4?hello?zjt
5?hello?ataola
6?hello?zjt
7?hello?ataola
8?hello?zjt
9?hello?ataola
上面這個(gè)例子中我們定義了一個(gè)函數(shù)sayHello,然后給函數(shù)的形參一個(gè)初始值,如果調(diào)用函數(shù)沒(méi)有傳的話就取默認(rèn)值,這個(gè)例子本身沒(méi)有什么意義,就作為演示意思下。
類
講到類,就不得不提面向?qū)ο罅?,以及封裝繼承多態(tài)啦。這里我們作為入門(mén)環(huán)節(jié),簡(jiǎn)單地用一個(gè)例子感受下。
我們先創(chuàng)建一個(gè)類Person,然后我們?cè)賱?chuàng)建一個(gè)類Robot去繼承Person.
代碼:
class?Person():
????"""?人類?"""
????def?__init__(self,?name,?age):
????????self.name?=?name
????????self.age?=?age
????def?speak(self):
????????print(self.name.title(),?'?is?speaking.')
class?Robot(Person):
????def?__init__(self,?name,?age):
????????super().__init__(name,?age)
ataola?=?Person('zheng?jiangtao',?24)
ataola.speak()
robot?=?Robot('xiao?ai',?3)
robot.speak()
輸出:
Zheng?Jiangtao??is?speaking.
Xiao?Ai??is?speaking.
我們實(shí)例化了一個(gè) Person 類 ataola,然后調(diào)用了 speak 方法,我們還實(shí)例化了一個(gè) Robot 類,然后調(diào)用了其繼承 Person 類的 speak 方法。
說(shuō)明
本文首發(fā)于 GitHub 倉(cāng)庫(kù)https://github.com/ataola/a2python,線上閱讀地址:https://zhengjiangtao.cn/a2python/,轉(zhuǎn)載請(qǐng)注明出處,謝謝!
