一篇超級最全的python基礎(chǔ)篇
GPT-4 Plus賬號又降價了!
Sora社群,正式上線!
最新版Pycharm 2022.3最新激活教程,有效期到2099年!
數(shù)據(jù)類型和變量
- Python使用縮進來組織代碼塊,一般使用4個空格的縮進.使用#來注釋一行,其他每一行都是一個語句,當(dāng)語句以冒號:結(jié)尾時,縮進的語句視為代碼塊.Python對大小寫敏感.
1.1 整數(shù)
- Python可以處理任意大小的整數(shù),包括負(fù)整數(shù),寫法與數(shù)學(xué)上寫法一致,例如:-100.如果用十六進制表示,則用前綴為0x和0-9,a-f表示,例如:0xff00.
1.2 浮點數(shù)
- 浮點數(shù)的表示方法:3.14,-9.01.若是科學(xué)技術(shù)法表示,則10用e代替,例如:1.23$\times10^9$表示為1.23e9.
- 整數(shù)和浮點數(shù)在計算機內(nèi)存儲的方式不同,整數(shù)運算永遠是精確的(包括除法運算),浮點數(shù)運算可能會存在四舍五入的誤差.
1.3 字符串
- 字符串是單引號或雙引號括起來的文本.
- 如果字符串中包含單引號,則用雙引號括起來;
- 如果包含雙引號,則用單引號括起來;
- 如果既包含單引號又包含雙引號,則使用轉(zhuǎn)義字符\來標(biāo)識,例如:'I'm "OK"!'表示的是I'm "OK"!.
- python中用r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義,例如print(r'\\t\')即打印\\t\.
- python中用
...三引號來輸入多行內(nèi)容,其中...是提示符,表示接著上一行輸入,例如:
>>> print(```line1
...line2
... line3```)
line1
line2
line3
1.4 布爾值
- 布爾值只有True和Flase兩種(注意大小寫,Python對大小寫敏感),常用于if的條件判斷.
布爾值運算規(guī)則如下:
- and運算是與運算,只有所有都為True,and運算結(jié)果才是True.
- or運算是或運算,只要其中有一個為True,or運算結(jié)果就是True.
- not運算是非運算,它是一個單目運算符,把True變成False,False變成True.
1.5 空值
- 空值是Python里一個特殊的值,用None表示.
1.6 變量
- Python中變量類型不固定,即動態(tài)語言,不需要提前聲明.使用=直接賦值,同一個變量可以反復(fù)賦值,且可以是不同類型的變量.例如:
a = 123 #a是整數(shù),即a指向整數(shù)123
a= "ABC" #將a賦值成字符串,即a指向字符串"ABC"
b = a #將b指向a所指向的數(shù)據(jù)("ABC")
a = "XYZ" #將a指向字符串"XYZ"
print(b) #打印b將打印"ABC"而不是"XYZ"
變量a="ABC"賦值中,Python解釋器處理了以下事項:
- 在內(nèi)存中創(chuàng)建一個"ABC"的字符串;
- 在內(nèi)存中創(chuàng)建了一個名為a的變量,并把它指向"ABC".
- 把a賦值給b,實際上是將b指向a所指向的數(shù)據(jù).
1.7 常量
- 常量一般用全部大寫的變量名表示,例如:PI=3.14.實際上,Python沒有機制保證PI的值不會被改變,所以本質(zhì)仍然是個變量.
Python的除法:
- /的除法計算結(jié)果是浮點數(shù),即使是兩個整數(shù)相除也是浮點數(shù),例如9 / 3結(jié)果為3.0.
- //除法只取結(jié)果的整數(shù)部分,例如10 // 3結(jié)果是整數(shù)部分3.
- %表示取余數(shù),例如:10 % 3結(jié)果是余數(shù)1.
1.8 總結(jié)
- Python支持多種數(shù)據(jù)類型,在計算機內(nèi)部可以把任何數(shù)據(jù)看成一個”對象”,而變量賦值就是將變量和數(shù)據(jù)對象關(guān)聯(lián)起來,即變量指向該數(shù)據(jù)對象.例如x=y,表示把變量x指向y所指向的數(shù)據(jù)對象,隨后對y的賦值并不影響x的指向.
- Python的整數(shù)和浮點數(shù)沒有大小的限制.若超出一定范圍就用inf(無限大)表示.
2.1 字符編碼
- ASCII編碼,早期的編碼包含大小寫英文字母、數(shù)字和一些符號,用一個字節(jié)(8位)表示.因編碼量少可能會出現(xiàn)亂碼問題.
- Unicode編碼,統(tǒng)一各國語言編碼,用兩個字節(jié)(16位)表示.如果文本全是英文,則會比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上不劃算.
- UTF-8編碼,即可變長的Unicode編碼,UTF-8編碼把一個Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個字節(jié),常用的英文字母被編碼成1個字節(jié),漢字通常是3個字節(jié),只有很生僻的字符才會被編碼成4-6個字節(jié).如果你要傳輸?shù)奈谋景罅坑⑽淖址?用UTF-8編碼能節(jié)省空間.
2.2 字符編碼使用場景
- 在計算機內(nèi)存中,統(tǒng)一使用Unicode編碼.
- 當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r候,就轉(zhuǎn)換為UTF-8編碼. 例如: 用記事本編輯的時候,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里,編輯完成后,保存的時候再把Unicode轉(zhuǎn)換為UTF-8保存到文件.
瀏覽網(wǎng)頁的時候,服務(wù)器會把動態(tài)的生成的Unicode內(nèi)容轉(zhuǎn)換為UTF-8再傳輸?shù)綖g覽器,所以很多網(wǎng)頁的源碼上會有類似的信息,表示該網(wǎng)頁正是用的UTF-8編碼.
2.3 Python的字符串
- Python3的版本中,字符串是Unicode編碼,即支持多語言.
- 對于單個字符的編碼,Python提供ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對應(yīng)的字符.例如:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'米'
如果知道字符的整數(shù)編碼,可以用十六進制寫str:
>>> '\u4e2d\u6587'
'中文'
2.4 字符串(編碼)轉(zhuǎn)換
- Python的字符串類型是str,在內(nèi)存中以Unicode表示,一個字符對應(yīng)若干個字節(jié).如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤上,就需要把str變?yōu)橐宰止?jié)為單位的bytes(UTF-8/ASCII編碼).
Python對bytes類型的數(shù)據(jù)用帶b前綴的單引號或雙引號表示:
x = b'ABC'
2.4.1 encode()[str→bytes]
- 以Unicode表示的str通過encode()方法可以編碼為指定的bytes,即Unicode編碼轉(zhuǎn)換成UTF-8編碼或ASCII編碼,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
#錯誤例子
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
2.4.2 decode()[bytes→str]
- 要把UTF-8編碼或ASCII編碼轉(zhuǎn)換成Unicode編碼,即bytes類型轉(zhuǎn)換為str類型,可用decode()轉(zhuǎn)換.例如:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
#錯誤例子
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分無效的字節(jié),可以傳入errors='ignore'忽略錯誤的字節(jié):
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
2.4.3 len()
對于str類型len()計算的是字符數(shù),對于bytes類型len()計算的是字節(jié)數(shù).
#對于str類型
>>> len('ABC')
3
>>> len('中文')
2
#對于bytes類型
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
- 1個中文字符經(jīng)過UTF-8編碼后通常會占用3個字節(jié),而1個英文字符只占用1個字節(jié).
- 為了避免中文亂碼,一般使用UTF-8編碼對str和bytes進行轉(zhuǎn)換,即Unicode→UTF-8.所以一般在Python源文件開頭寫以下信息:
1
2 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
- 第一行注釋是為了告訴Linux/OS X系統(tǒng),這是一個Python可執(zhí)行程序,Windows系統(tǒng)會忽略這個注釋;
- 第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼.
2.5 格式化
2.5.1 %的方式
- 使用%來格式化字符串,其中%s永遠起作用,可以把任何數(shù)據(jù)類型轉(zhuǎn)換成字符串,如果字符串中包含%,則使用%%轉(zhuǎn)義表示字符串中的%.常用占位符如下:
占位符 替換內(nèi)容
%s 字符串
%d 整數(shù)
%f 浮點數(shù)
%x 十六進制整數(shù)
例如:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
#整數(shù)和浮點數(shù)
>>> print('%2d-%02d' % (3, 1))
>>> print('%.2f' % 3.1415926)
# %s的通用性
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
#轉(zhuǎn)義字符串中的%
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
2.5.2 format()
- 可以使用字符串的format()方法,它會用傳入的參數(shù)依次替換字符串內(nèi)的占位符{0}、{1}…….但建議直接使用%的方式.
>>> 'Hello, {0}, 成績提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成績提升了 17.1%'
3. list和tuple類型
3.1 list
- list表示列表,是可變的有序列表,即有序的集合,可以隨時添加和刪除元素.
3.1.1:list的定義
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
3.1.2 len()
用len()函數(shù)可以獲得list元素的個數(shù)
1
2 >>> len(classmates)
3
3.1.3 list的索引
- list元素索引從0開始
- 索引可以引用負(fù)數(shù)表示倒數(shù)序號,例如classmates[-1]表示倒數(shù)最后一個元素,索引-1等價于len(classmates) - 1
- 索引越界會報IndexError錯誤,倒序索引也會越界
3.1.4 list元素增刪
- 3.1.4.1 追加末尾元素
1
2
3 >>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
3.1.4.2 指定位置插入元素
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
3.1.4.3 刪除末尾元素
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
3.1.4.4 刪除指定位置元素
用pop(i)的方法,i為索引值
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
3.1.4.5 替換元素
即直接給對應(yīng)索引的元素重新賦值.
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
3.1.5多維list
- list中元素的數(shù)據(jù)類型可以不同,如果要實現(xiàn)二維list,即將一維list中的元素定義為list即可,同理可以實現(xiàn)多維list.例如訪問二維list可用s[2][1]的方式,表示一維list中的第三個元素list中的第二個元素.
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
3.1.6 空list
空list即一個元素也沒有,長度為0.
1
2
3 >>> L = []
>>> len(L)
0
3.2 tuple
3.2.1 tuple的定義
- tuple表示元組,即不可變的有序元素的集合.即沒有修改元素的函數(shù),例如append(),insert(),元素賦值等.
- 因為tuple元素不可變,所以代碼更安全.當(dāng)定義tuple時,元素就必須被確定下來.如果tuple中只含一個元素,則在該元素后加逗號.避免與小括號運算產(chǎn)生歧義.
#以下是單元素tuple的定義
>>> t = (1,)
>>> t
(1,)
#以下是小括號運算
>>> t = (1)
>>> t
1
3.2.2 特別說明
- tuple中的元素不可變表示元素的指向不可變,但該元素如果是list,則該list的內(nèi)容可變.即list表示的是指向,該list的指向不可變,但是list中元素的指向可變,即list中的元素可變.例如:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
示意圖:
- list元素修改前:t = ('a', 'b', ['A', 'B'])
- list元素修改后:t = ('a', 'b', ['X', 'Y'])
4. dict和set類型
4.1 dict
4.1.1 dict的定義
- dict即字典,相當(dāng)于golang中的map類型,key-value型.具有極快的查找速度.
//dict的賦值
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
//dict元素的賦值
>>> d['Adam'] = 67
- 由于dict中key的值是唯一的,因此如果多次賦值,最終結(jié)果為最后一次的賦值.
4.1.2 dict的查找
- 如果key不存在會報錯,檢測key是否存在可以通過in或get()方法.當(dāng)key不存在時,in的方式返回False,get()方法返回None或指定值.
#key不存在的報錯
>>> d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'
#in方式檢查key是否存在
>>> 'Thomas' in d
False
#get()方法檢查key是否存在
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
4.1.3 dict的刪除
- 要刪除dict中的元素,可以通過用pop(key)方法,刪除該key對應(yīng)的鍵值對.
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
4.1.4 特別說明
dict的特點:
- 查找和插入的速度極快,不會隨著key的增加而變慢;
- 需要占用大量的內(nèi)存,內(nèi)存浪費多.
- dict的key必須是不可變對象,在Python中,字符串、整數(shù)等都是不可變的,而list是可變的,就不能作為key.
對比list的特點:
- 查找和插入的時間隨著元素的增加而增加;
- 占用空間小,浪費內(nèi)存很少.
4.2 set
- set表示無序和無重復(fù)元素的集合,與數(shù)學(xué)意義上的集合類似,也可以看成是只有key沒有value的dict.
4.2.1 set的定義
- 要創(chuàng)建一個set,需要提供一個list作為輸入集合,如果list中有重復(fù)元素則自動過濾掉.
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
#如果有重復(fù)元素會自動過濾掉
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
4.2.2 set的添加和刪除
- 通過add(key)方法可以添加元素到set中,可以重復(fù)添加,但無效.
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通過remove(key)方法可以刪除元素.
>>> s.remove(4)
>>> s
{1, 2, 3}
4.2.3 set的交集和并集
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
#交集
>>> s1 & s2
{2, 3}
#并集
>>> s1 | s2
{1, 2, 3, 4}
4.3 不可變對象
- 變量表示一個指向,而變量指向的內(nèi)容表示一個對象.例如a="abc"中a是變量即指向,而abc是字符串對象.
- Python中整數(shù)和字符串是不可變對象,而list是可變對象.
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
- 例如上例中,a是變量,abc是字符串對象,當(dāng)調(diào)用a的replace的方法時,實際上是基于原字符串對象重新創(chuàng)建了一個新的字符串對象Abc,而沒有改變原字符串對象的內(nèi)容.
- 對于不變對象來說,調(diào)用對象自身的任意方法,不會改變該對象自身的內(nèi)容.而會創(chuàng)建新的對象并返回.
5.1 if格式
if <條件判斷1>:
<執(zhí)行1>
elif <條件判斷2>:
<執(zhí)行2>
elif <條件判斷3>:
<執(zhí)行3>
else:
<執(zhí)行4>
- 以上是if語句的完整格式,注意事項:
- Python使用縮進規(guī)則,如果if判斷條件為true,則執(zhí)行縮進部分的內(nèi)容.
- if的執(zhí)行邏輯是從上往下判斷,如果某個判斷為true,則會忽略剩下的elif和else.
- 例如:以下例子打印的結(jié)果是teenager,即滿足第一個if條件則后續(xù)判斷不再執(zhí)行.
age = 20
if age >= 6:
print('teenager')
elif age >= 18:
print('adult')
else:
print('kid')
5.2 條件簡寫
if x:
print('True')
只要x是非零數(shù)值、非空字符串、非空list等,就判斷為True,否則為False.
5.3 input()使用
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
- input()返回的數(shù)據(jù)類型是str,str不能直接和整數(shù)比較,必須先把str轉(zhuǎn)換成整數(shù).Python提供了int()函數(shù)來轉(zhuǎn)換成整數(shù).
6.1 for循環(huán)
for…in循環(huán),即把list或tuple中的每個元素迭代出來,執(zhí)行后續(xù)操作.
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
Python提供一個range(x)函數(shù),生成0-(x-1)的整數(shù)序列.
>>> list(range(5))
[0, 1, 2, 3, 4]
//求和運算
sum = 0
for x in range(101):
sum = sum + x
print(sum)
6.2 while循環(huán)
while循環(huán),只要條件滿足,就不斷循環(huán),條件不滿足時退出循環(huán).
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
6.3 break
在循環(huán)中,break語句可以提前退出循環(huán).
n = 1
while n <= 100:
if n > 10: # 當(dāng)n = 11時,條件滿足,執(zhí)行break語句
break # break語句會結(jié)束當(dāng)前循環(huán)
print(n)
n = n + 1
print('END')
6.4 continue
- 在循環(huán)過程中,可以通過continue語句,跳過當(dāng)前的這次循環(huán),直接開始下一次循環(huán).
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶數(shù),執(zhí)行continue語句
continue # continue語句會直接繼續(xù)下一輪循環(huán),后續(xù)的print()語句不會執(zhí)行
print(n)
- break和continue通常都必須配合if語句使用.
END
我們團隊創(chuàng)建了一個Sora 交流星球,專門用來更新 Sora Sora 學(xué)習(xí)資料,覆蓋介紹、未來變現(xiàn)玩法、各路觀點、技術(shù)解讀等等,感興趣讀者可掃碼下方二維碼加入了解!
原價399,新春特價99,滿500漲價至199
可以確定的是:未來10-20年,一定是 AI 的大風(fēng)口、大時代,如果錯過了公眾號、錯過了抖音、錯過了小紅書。
請一定不要錯過 AI +。
在這個史詩級別的超級大風(fēng)口下,普通人只需要抓住其中的一個小點,即可實現(xiàn)人生自由、財富自由。
希望,大家都能夠抓住這一波。
