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

那個經(jīng)典的“Hello World”
在 Python 語言中,我們可以通過print函數(shù)去打印相關(guān)的信息,比如說在 Python3 中我們要打印出一個Hello World,可以這樣寫。
#?encoding:?utf-8
if?__name__?==?'__main__':
????print('Hello?World')
基礎(chǔ)知識梳理
如樓上的 Hello World 所示,在 Python 語言中,末尾是不用加分號的。Python 是一門解釋型,它并不像 C、C++這樣,需要有個編譯的過程,將代碼編譯成機器碼(轉(zhuǎn)換成計算機可識別的二進制指令)然后運行,在編譯過程中要確定變量的類型,通不過編譯就不能運行。Python 語言需要一個解釋器,邊解釋邊運行,所以在定義變量的時候并不需要指出其是什么類型,遵循變量名 = 變量值這種方式即可,關(guān)于變量名的規(guī)范和其它語言也差不多,這里就不展開贅述了,后面的相關(guān)類型的變量賦值本身是沒有什么好講的,但是 Python 語言有意思就有意思在它的庫多,你不用洋洋灑灑寫很多,你只要庫調(diào)的好,代碼是非常簡潔的。
字符串
比如說我們要定義一個字符串變量名name為ataola,就可以寫作name = 'ataola'。如果說字符串很長,我們期望原樣輸出,那么可以這樣寫。
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ù)名,或者保留字沖突,比如這里你寫作str = 'what's wrong with you ?'就很不好,因為str是系統(tǒng)函數(shù),它可以把變量轉(zhuǎn)成字符串類型。例如樓下這個例子,如果不用str函數(shù)將整型變量age轉(zhuǎn)換成字符串類型的話,就會出現(xiàn)運行出錯,因為他們不是一個類型的變量。
age?=?24
msg=?"i?am?"?+?str(age)?+?"?year?old"
print(msg)
一些常用的字符串 API
title: 首字母大寫upper: 大寫lower: 小寫strip: 去空lstrip: 左邊去空rstrip: 右邊去空split: 字符串轉(zhuǎn)列表count: 統(tǒng)計字符出現(xiàn)的次數(shù)
例子 1
代碼:
_str?=?'hello?world'
print('首字母大寫:',?_str.title())
print('大寫:',?_str.upper())
print('小寫:',?_str.lower())
輸出:
首字母大寫:?Hello?World
大寫:HELLO WORLD
小寫: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 的最后一行可見 Python 是支持函數(shù)鏈式調(diào)用的。
整型
python3 的整型范圍是無限的,所以它特別適合拿來做科學(xué)計算相關(guān)的,因為你不用擔(dān)心它會精度溢出。有意思的是,它允許你用_下劃線表示數(shù)字的分隔符,提高其可讀性,這并不影響其數(shù)值,比如1_000,它和1000是一樣的。
一些常用處理數(shù)字的 API
bin: 轉(zhuǎn)二進制abs: 求絕對值bool: 轉(zhuǎn)布爾值float: 轉(zhuǎn)浮點數(shù)pow: 冪函數(shù)一些位運算。。。。。。
例子 4
代碼:
print(bin(8))?#?十進制轉(zhuǎn)二進制
print(abs(-10))?#?絕對值
print(?1?and?0?==?1?&?0)?#?按位于
print?((1?or?0)?==?(1?|?0))?#?按位或
print(~11?==?-12)#?取反(二進制的負數(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))?#?次方運算符?和?冪函數(shù)
print(bool(1)?==?True?)?#?轉(zhuǎn)布爾類型,除0外都是True
print(bool(0)?==?True?)?#?轉(zhuǎn)布爾類型,除0外都是True
print(float(100))?#?整數(shù)轉(zhuǎn)浮點
輸出:
0b1000
10
True
True
True
True
True
True
True
True
True
False
100.0
浮點
為什么0.1 + 0.2 != 0.3, 3 * 0.1 != 0.3, 而是0.30000000000000004?
我們知道計算機只能識別二進制,所以浮點數(shù)會被轉(zhuǎn)換成二進制,0.1 轉(zhuǎn)成二進制是0.0001100110011001100110011001100110011001100110011001101, 0.2 轉(zhuǎn)成二進制是0.001100110011001100110011001100110011001100110011001101,相加得到的結(jié)果是0.0100110011001100110011001100110011001100110011001101. 簡單的說就是像 0.1 這種無法被二進制完整表示。
這里我們可以通過round(num, digits)去使結(jié)果符合預(yù)期,例如print(round(0.1 + 0.2, 1)),就能得到 0.3
注意:
十進制整數(shù)轉(zhuǎn)二進制方法:除 2 取余;十進制小數(shù)轉(zhuǎn)二進制方法:乘 2 除整
布爾值
在 Python 中,用True表示真,用False表示假,注意這里是區(qū)分大小寫的。
我們來看下面這個例子
例子 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, 而字符串它不能表示成真或假,但是可以通過bool函數(shù)將其轉(zhuǎn)回成真假
列表
列表是一系列按特定順序排列的元素組成,類似于 Javascript 中的數(shù)組。值得一提的是,在列表訪問的時候,它的索引下標可以為負數(shù),例如a[-1]就是表示列表 a 中的倒數(shù)第一個元素
一些常用的列表 API
sort: 排序reverse: 反轉(zhuǎn)len: 長度append: 從列表末尾插入元素insert: 列表任意位置插入元素pop: 從列表末尾彈出元素remove: 從右往左移除第一個遇到的目標元素
我們一起來看下面這個例子,
例子 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),通過list.sort(),這種方式它會改變列表的原值,而且在函數(shù)中可以傳一個參數(shù)reverse來表示是順著排序還是倒著排序。
我們再來看一個例子
例子 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]
樓上的例子首先我定義了一個列表arr = [1, 2, 3, 4, 5],然后我去訪問了它的第一個元素和最后一個元素,接著我通過append函數(shù)在列表后面追加了6,之后我又通過insert函數(shù)在第五個元素的位置插入了4.5,緊接著我用del又把它刪除了,然后我通過調(diào)用pop彈出了列表最后的元素,之后我又給它穿了個參數(shù)2,表示將第三個元素彈出,最后我通過remove函數(shù)去刪除了從列表最后往前找到的第一個目標元素。
字典
字典是一系列的鍵值對,類似于 JavaScript 中的對象。我們還是以具體的示例來看下。
例子 7
代碼:
user?={?'name':?'ataola',?'age':?24,?'sex':?'男'?}
print(user)
print('Hello?',?user['name'])
輸出:
{'name':?'ataola',?'age':?24,?'sex':?'男'}
Hello??ataola
這里我們定義了一個用戶信息的字典,然后試著把它打印出來,通過鍵值對的鍵可以訪問它的值,接著我們試著構(gòu)造字符串去試著訪問它。
例子 8
代碼:
for?key,?value?in?user.items():
????print(key,?value)
輸出:
name?ataola
age?24
sex?男
上面這個例子就是遍歷字典的鍵值對的方法。
如果我只是想遍歷它的鍵或者值呢?通過keys()表示鍵,通過values()表示值。
代碼:
for?key?in?user.keys():
????print(key)
輸出:
name
age
sex
代碼:
for?value?in?user.values():
????print(value)
輸出:
ataola
24
男
這里再進一步思考下,如果說我遍歷的值有很多重復(fù)呢?我怎么讓它不重復(fù)呢?嗯,對,答案就是集合去重。當(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ù)編程語言里都差不多,不外乎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
這個程序是這樣子的,當(dāng)用戶輸入quit的時候,那么我就退出這個程序,不然我就原樣輸出。
條件判斷
代碼:
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
這個程序是這樣子的,提示用戶輸入一個數(shù),然后判斷這個數(shù)的大小,通過if,elif,else來判斷輸入的數(shù)是大還是小,抑或是正常,這就是個例子,本身沒有什么意義。
for 循環(huán)
代碼:
numbers?=?list(range(1,?20))
for?num?in?numbers:
????if?num?%?2?==?0:
????????print(num,?'是個偶數(shù)')
????else:
????????print(num,?'是個奇數(shù)')
print(numbers)
輸出:
1?是個奇數(shù)
2?是個偶數(shù)
3?是個奇數(shù)
4?是個偶數(shù)
5?是個奇數(shù)
6?是個偶數(shù)
7?是個奇數(shù)
8?是個偶數(shù)
9?是個奇數(shù)
10?是個偶數(shù)
11?是個奇數(shù)
12?是個偶數(shù)
13?是個奇數(shù)
14?是個偶數(shù)
15?是個奇數(shù)
16?是個偶數(shù)
17?是個奇數(shù)
18?是個偶數(shù)
19?是個奇數(shù)
[1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19]
樓上的這個例子,我們用了一個 for 循環(huán)遍歷了列表 numbers 里面的項,然后結(jié)合 if 判斷這個項是奇數(shù)還是偶數(shù)。
函數(shù)
函數(shù)本質(zhì)是帶名字的代碼段,在 python 中我們可以通過def去定義一個函數(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
上面這個例子中我們定義了一個函數(shù)sayHello,然后給函數(shù)的形參一個初始值,如果調(diào)用函數(shù)沒有傳的話就取默認值,這個例子本身沒有什么意義,就作為演示意思下。
類
講到類,就不得不提面向?qū)ο罅耍约胺庋b繼承多態(tài)啦。這里我們作為入門環(huán)節(jié),簡單地用一個例子感受下。
我們先創(chuàng)建一個類Person,然后我們再創(chuàng)建一個類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.
我們實例化了一個 Person 類 ataola,然后調(diào)用了 speak 方法,我們還實例化了一個 Robot 類,然后調(diào)用了其繼承 Person 類的 speak 方法。
說明
本文首發(fā)于 GitHub 倉庫https://github.com/ataola/a2python,線上閱讀地址:https://zhengjiangtao.cn/a2python/,轉(zhuǎn)載請注明出處,謝謝!
