1、數據類型
1.1 編程規範
註釋
python註釋也有自己的規範,在文章中會介紹到。註釋可以起到一個備註的作用,團隊合作的時候,個人編寫的代碼經常會被多人調用,爲了讓別人能更容易理解代碼的通途,使用註釋是非常有效的。
在說規範之前我們有必要先看以下Python的註釋有哪些 ?
- 單行註釋
- 多行註釋
單行註釋
以 #
開頭,#
右邊的所有東西都被當做說明文字,而不是真正要執行的程序,只起到輔助說明作用
示例代碼如下:
# 這是第一個單行註釋
print("hello python")
爲了保證代碼的可讀性,
#
後面建議先添加一個空格,然後再編寫相應的說明文字
多行註釋(塊註釋)
如果註釋信息很多,一行無法顯示,就可以使用多行註釋
要在 Python 程序中使用多行註釋,可以用一對連續的 三個 引號(單引號和雙引號都可以)
示例代碼如下:
"""
這是一個多行註釋
在多行註釋之間,可以寫很多很多的內容……
"""
print("hello python")
註釋不是越多越好,對於一目瞭然的代碼,不需要添加註釋
標識符命名規則
開發人員在程序中自定義的一些符號和名稱。標識符是自己定義的, 如變量名 、函數名等
標識符由字母、下劃線和數字組成,且數字不能開頭
python中的標識符是區分大小寫的
命名規則
1、下滑線命名法
用下劃線“_”來連接所有的單詞,比如 hello_world
見名知意
起一個有意義的名字,儘量做到看一眼就知道是什麼意思(提高代碼可讀性) 比如: 名字 就定義爲 name , 定義學生 用 student
2、駝峯命名法
大駝峯式命名法(upper camel case):
-
每一個單字的首字母都採用大寫字母,
例如:FirstName、HelloWorld
小駝峯式命名法(lower camel case):
第一個單詞以小寫字母開始;
-
第二個單詞的首字母大寫,
例如:helloWorld、firstName
注意
所有的變量名、函數名 都是用下劃線命名法
類名使用大駝峯命名法
python命名規則
- python中的標識符是區分大小寫的
- 變量、函數名全部用小寫與下劃線
- 常量(配置文件變量、不修改的變量)全部用大寫
- 類名用大駝峯命名法
案例: 命名規範查看
# 類名用大駝峯 類與其他內容用兩個換行隔開
class Student(object):
# 變量名之間用空格隔開
def __init__(self, hello):
self.hello = hello
# 函數與函數之間加換行
def print_hello_world(self):
"""
函數名用下劃線命名法
儘量滿足見名知意
"""
print(f"hello.jpg {self.hello} !")
def PrintHelloWorld(self):
"""大駝峯命名法提示有問題"""
print(f"hello.jpg {self.hello} !")
def printHelloWorld(self):
"""小駝峯命名法提示有問題"""
print(f"hello.jpg {self.hello} !")
def printhelloworld(self):
"""直接寫很難讀懂"""
print(f"hello.jpg {self.hello} !")
def PRINTHELLOWORLD(self):
"""直接寫很難讀懂"""
print(f"hello.jpg {self.hello} !")
"""團隊規範"""
# 變量名使用下劃線命名法
# 儘量滿足見名知意
# 對象也是變量
student = Student("world")
student.print_hello_world()
關於代碼規範
-
Python
官方提供有一系列 PEP(Python Enhancement Proposals) 文檔 - 其中第 8 篇文檔專門針對 Python 的代碼格式 給出了建議,也就是俗稱的 PEP 8
- 文檔地址:https://www.python.org/dev/peps/pep-0008/
- 谷歌有對應的中文文檔:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/
任何語言的程序員,編寫出符合規範的代碼,是開始程序生涯的第一步
編程習慣的重要性
- 可以方便排查錯誤
- 方便自己看的代碼
- 便於別人看懂你的代碼(團隊協作)
良好的編程習慣的養成不能靠說,要靠多練,要在大量的編程中將其融入骨髓中。
一套系統應該具有統一的編程風格,任何編程風格都不可能是完美,應該從可維護性、可讀性方面繼續保持一種編程風格,而不要將多種編程風格混合在一套系統中,對於新手,難以理解如此多種風格的編碼。
ctrl + alt + l 快速格式化代碼
輸入輸出與變量
輸出
print() 方法用於打印輸出,最常見的一個函數。
以下是 print() 方法的語法:
print(*objects, sep=' ', end='\n', file=sys.stdout)
參數
-
objects
-- 複數,表示可以一次輸出多個對象。輸出多個對象時,用分隔符分割。 -
sep
-- 用來間隔多個對象,默認值是一個空格。 -
end
-- 用來設定以什麼結尾。默認值是換行符 \n,我們可以換成其他字符串。 -
file
-- 要寫入的文件對象。
輸入
input() 函數接受一個標準輸入數據,返回爲 string 類型。
>>>a = input("input:")
input:123 # 輸入整數
>>> type(a)
<class 'str'> # 字符串
變量
程序就是用來處理數據的,而變量就是用來存儲數據的
- 在 Python 中,每個變量在使用前都必須賦值,變量賦值以後該變量纔會被創建
- 等號(=)用來給變量賦值
-
=
左邊是一個變量名 -
=
右邊是存儲在變量中的值
-
- 直接使用之前已經定義的變量
- 變量名只有在 第一次出現 纔是 定義變量
- 變量名再次出現,不是定義變量,而是直接使用之前定義過的變量
- 在程序開發中,可以修改之前定義變量中保存的值嗎?
- 可以
- 變量中存儲的值,就是可以 變 的
變量名 = 值
變量定義之後,後續就可以直接使用了
1.2 數值類型
int(整形)
在
Python
中定義變量是 不需要指定類型(在其他很多高級語言中都需要)
整形,也被稱之爲整數。整數就是數學中的數字。
整形在Python中不受長度限制大小範圍
使用
type
函數可以查看一個變量的類型
In [1]: 1
Out[1]: 1
In [2]: type(1)
Out[2]: int
浮點型(float)
小數類型
小數
In [1]: 1.0
Out[1]: 1.0
In [2]: type(1.0)
Out[2]: float
運算、運算符優先級與整形是一樣。
類型轉化
浮點數轉化爲整形(顯示轉化)
In [3]: int(1.0)
Out[3]: 1
In [4]: float(1)
Out[4]: 1.0
隱式轉化,系統背後默認進行轉換
In [5]: 1/2
Out[5]: 0.5
1.3 字符串
字符串是一種不可變的序列類型
字符串創建
字符串是 Python 中最常用的數據類型。我們可以使用引號( ' 或 " )來創建字符串。
創建字符串很簡單,只要爲變量分配一個值即可。
單引號和雙引號
在 Python
中我們都知道單引號和雙引號都可以用來表示一個字符串,比如
print("What's your name?")
結果:
"What's your name?"
print('"python"是一門優秀的語言')
結果:
"python"是一門優秀的語言
一個單引號並不是單引號,它是字符串創建的格式
總體來說沒有任何區別,只在單引號當普通字符時容易區分:如 var = "let's go"
三引號創建塊字符串 長字符串
# 三引號實現塊註釋
""" 文檔註釋
三引號實現塊註釋
"""
''''''
字符串格式化
把不是字符類型的 轉變成字符串
在 Python 中可以使用 print
函數將信息輸出到控制檯
如果希望輸出文字信息的同時,一起輸出 數據,就需要使用到 格式化操作符
format
此函數可以快速的處理各種字符串,增強了字符串格式化的功能。基本語法是使用{}和:來替代%。format函數可以接受不限各參數,位置可以不按照順序
name = '張三'
age = 18
nickname = '法外狂徒'
# format 用 {} 佔位
print('姓名:{},年齡{},外號:{} '.format(name, age, nickname))
print('hello {} 你今年已經{}歲了'.format(name, age))
# 保留小數點後兩位
In [1]: '{:.2f}'.format(12.333)
Out[1]: '12.33'
In [2]: '{a:.2f}'.format(a=12.333)
Out[2]: '12.33'
In [3]: '{a:6.2f}'.format(a=12.333)
Out[3]: ' 12.33'
%s
%
被稱爲 格式化操作符,專門用於處理字符串中的格式
- 包含
%
的字符串,被稱爲 格式化字符串 -
%
和不同的 字符 連用,不同類型的數據 需要使用 不同的格式化字符
格式化字符 | 含義 |
---|---|
%s | 字符串 |
%d | 有符號十進制整數,%06d 表示輸出的整數顯示位數,不足的地方使用 0 補全 |
%f | 浮點數,%.2f 表示小數點後只顯示兩位 |
%% | 輸出 %
|
語法格式如下:
print("格式化字符串 %s" % 變量1)
print("格式化字符串" % (變量1, 變量2...))
name = '張三'
age = 18
nickname = '法外狂徒'
name2 = '李四'
age2 = 19
nickname2 = '幫兇'
# %s 用 %s 佔位
print('姓名:%s' % name)
# 多個參數
print('%s,%s 哦嗨呦' % (name, name2))
格式化字符 | 含義 |
---|---|
%s | 字符串 |
%d | 有符號十進制整數,%06d 表示輸出的整數顯示位數,不足的地方使用 0 補全 |
%f | 浮點數,%.2f 表示小數點後只顯示兩位 |
%% | 輸出 %
|
%c | %ASCII字符 |
%o | %8進制 |
%x | %16進制 |
%e | %科學計數法 |
f
f’{}'形式,並不是真正的字符串常量,而是一個運算求值表達式,可以很方便的用於字符串拼接、路徑拼接等
name = '張三'
# f 在字符串中嵌入變量
print(f'hello {name} !')
案例:貓眼top100網址
貓眼top100的網址有以下特點:
第一頁:https://maoyan.com/board/4?offset=0
第二頁:https://maoyan.com/board/4?offset=10
第三頁:https://maoyan.com/board/4?offset=20
....
第十頁:https://maoyan.com/board/4?offset=90
請分別使用三種字符串構建的方法創建所有的請求地址
1.4 字符串常用方法
字符串是不可變數據類型,所有的操作都是返回新的一個列表,不會修改原有列表
字符串 能夠使用的 方法 如下:
In [1]: hello_str.
hello_str.capitalize hello_str.isidentifier hello_str.rindex
hello_str.casefold hello_str.islower hello_str.rjust
hello_str.center hello_str.isnumeric hello_str.rpartition
hello_str.count hello_str.isprintable hello_str.rsplit
hello_str.encode hello_str.isspace hello_str.rstrip
hello_str.endswith hello_str.istitle hello_str.split
hello_str.expandtabs hello_str.isupper hello_str.splitlines
hello_str.find hello_str.join hello_str.startswith
hello_str.format hello_str.ljust hello_str.strip
hello_str.format_map hello_str.lower hello_str.swapcase
hello_str.index hello_str.lstrip hello_str.title
hello_str.isalnum hello_str.maketrans hello_str.translate
hello_str.isalpha hello_str.partition hello_str.upper
hello_str.isdecimal hello_str.replace hello_str.zfill
hello_str.isdigit hello_str.rfind
提示:正是因爲 python 內置提供的方法足夠多,才使得在開發時,能夠針對字符串進行更加靈活的操作!應對更多的開發需求!
查找和替換
方法 | 用法 |
---|---|
string.strip() | 默認去掉 string 左右兩邊的空白字符 |
string.replace(old_str, new_str) | 把 string 中的 old_str 替換成 new_str |
string.split() | 默認以空白字符進行分割 |
string.join(seq) | 將 seq 中所有的元素(字符串類型)合併爲一個新的字符串 |
提問:如何改變字符串
將下面的字符串中 world 改成 Python
hello = "hello world !"
print(hello.replace('world', 'Python'))
print(hello)
字符串是一種不可變的數據類型。所有操作字符的方法都是返回一個新的字符串。可以用返回的新的字符串覆蓋掉之前的字符串。
轉義字符
在需要在字符中使用特殊字符時,python 用反斜槓轉義字符。如下表:
轉義字符 | 描述 |
---|---|
\ | (在行尾時)續行符 |
\ | 反斜槓符號 |
\' |
單引號 |
\" |
雙引號 |
\a | 響鈴 |
\b | 退格(Backspace) |
\e | 轉義 |
\000 | 空 |
\n | 換行 |
\v | 縱向製表符 |
\t | 橫向製表符 |
\r | 回車 |
\f | 換頁 |
\oyy | 八進制數,yy代表的字符,例如:\o12代表換行 |
\xyy | 十六進制數,yy代表的字符,例如:\x0a代表換行 |
\other | 其它的字符以普通格式輸出 |
原始字符串
由於字符串中的反斜線都有特殊的作用,因此當字符串中包含反斜線時,就需要使用轉義字符 \ 對字符串中包含的每個 '' 進行轉義。
比如說,我們要寫一個關於 Windows 路徑 G:\publish\codes\02\2.4 這樣的字符串,如果在 Python 程序中直接這樣寫肯定是不行的,需要使用 \ 轉義字符,對字符串中每個 '' 進行轉義,即寫成 G:\publish\codes\02\2.4 這種形式纔行。
有沒有覺得這種寫法很囉嗦,有沒有更好的解決辦法呢?答案是肯定的,藉助於原始字符串可以很好地解決這個問題。
原始字符串以“r”開頭,它不會把反斜線當成特殊字符。因此,上面的 Windows 路徑可直接寫成如下這種形式:
# 原始字符串包含的引號,同樣需要轉義
s2 = r'"Let\'s go", said Charlie'
print(s2)
1.5 布爾類型(bool)
python 中布爾值使用常量 True 和 False來表示;注意大小寫
bool
是 int
的子類(繼承 int
),故 True == 1 False == 0
是會返回 Ture
bool
類型只有兩種狀態真或假
In [17]: bool(-1)
Out[17]: True
In [18]: bool(0)
Out[18]: False
In [19]: bool(None)
Out[19]: False
In [20]: bool("")
Out[20]: False
In [21]: bool(" ")
Out[21]: True
In [22]: def a():
...: pass
...:
...: bool(a)
Out[22]: True
總結
True 對 False 錯
布爾類型只有兩種狀態,True
or Flase
。數字除了零之外,其餘均爲 True
,字符串除了空字符串之外都爲True
,對象除了空對象之外,其餘均爲 True
。
默認情況下,所有類型都可以轉化爲布爾類型
1.6 運算符
算數運算符
因爲是整數,所以也可以進行數學中的基本運算。
- 算數運算符是 運算符的一種
- 是完成基本的算術運算使用的符號,用來處理四則運算
運算符 | 描述 | 實例 |
---|---|---|
+ | 加 | 10 + 20 = 30 |
- | 減 | 10 - 20 = 10 |
* | 乘 | 10 * 20 = 200 |
/ | 除 | 10 / 20 = 0.5 |
// | 取整除 | 返回除法的整數部分(商) 9 // 2 輸出結果 4 |
% | 取餘數 | 返回除法的餘數 9 % 2 = 1 |
** | 冪 | 又稱次方、乘方,2 ** 3 = 8 |
# 取餘
In [16]: 9 % 4
Out[16]: 1
In [17]: 9 % 3
Out[17]: 0
In [18]: 2 ** 3
Out[18]: 8
除此之外,“+”還可以作爲字符串(包括後續要介紹的序列)的連接運算符。
s1 = 'Hello, '
s2 = 'Charlie'
# 使用+連接兩個字符串
print(s1 + s2)
算數運算符的優先級
和數學中的運算符的優先級一致,在 Python 中進行數學計算時,同樣也是:
- 先乘除後加減
- 同級運算符是 從左至右 計算
- 可以使用
()
調整計算的優先級
以下表格的算數優先級由高到最低順序排列
運算符 | 描述 |
---|---|
** | 冪 (最高優先級) |
* / % // | 乘、除、取餘數、取整除 |
+ - | 加法、減法 |
例如:
2 + 3 * 5 = 17
(2 + 3) * 5 = 25
2 * 3 + 5 = 11
2 * (3 + 5) = 16
賦值運算符
以下假設變量a爲10,變量b爲20:
運算符 | 描述 | 實例 |
---|---|---|
= | 簡單的賦值運算符 | c = a + b 將 a + b 的運算結果賦值爲 c |
+= | 加法賦值運算符 | c += a 等效於 c = c + a |
-= | 減法賦值運算符 | c -= a 等效於 c = c - a |
*= | 乘法賦值運算符 | c *= a 等效於 c = c * a |
/= | 除法賦值運算符 | c /= a 等效於 c = c / a |
%= | 取模賦值運算符 | c %= a 等效於 c = c % a |
**= | 冪賦值運算符 | c **= a 等效於 c = c ** a |
//= | 取整除賦值運算符 | c //= a 等效於 c = c // a |
比較運算符
比較運算符 | 功能 |
---|---|
> | 大於,如果運算符前面的值大於後面的值,則返回 True;否則返回 False |
>= | 大於或等於,如果運算符前面的值大於或等於後面的值,則返回 True;否則返回 False |
< | 小於,如果運算符前面的值小於後面的值,則返回 True;否則返回 False |
<= | 小於或等於,如果運算符前面的值小於或等於後面的值,則返回 True;否則返回 False |
== | 等於,如果運算符前面的值等於後面的值,則返回 True;否則返回 False |
!= | 不等於,如果運算符前面的值不等於後面的值,則返回 True;否則返回 False |
邏輯運算符
Python語言支持邏輯運算符,以下假設變量 a 爲 10, b爲 20:
運算符 | 邏輯表達式 | 描述 | 實例 |
---|---|---|---|
and | x and y | 布爾"與" ,兩個條件都滿足 | (a and b) 返回 20。 |
or | x or y | 布爾"或",兩個條件中滿足一個 | (a or b) 返回 10。 |
not | not x | 布爾"非" ,否定之前的結果 | not(a and b) 返回 False |
邏輯運算符案例:
x = 1
y = 0
print(x and y)
print(x or y)
print(not x)
print(not y)
# 案例升級
x = 3 > 4
y = 5 > 4
運算符優先級
以下表格列出了從最高到最低優先級的所有運算符:
運算符 | 描述 |
---|---|
** | 指數 (最高優先級) |
* / % // | 乘,除,取模和取整除 |
& | 位 'AND' |
<= < > >= | 比較運算符 |
<> == != | 等於運算符 |
= %= /= //= -= += *= **= | 賦值運算符 |
is is not | 身份運算符 |
in not in | 成員運算符 |
not and or | 邏輯運算符 |
案例:運算符優先級
r = 4 > 2 ** 4 or True is 1 and '4' in "345"
if r:
print('猜猜我的結果', r)
else:
print('猜猜我的結果', r)
1.7 總結
1、在演練中,一共有幾種數據類型?
- 4 種
-
str
—— 字符串 -
bool
—— 布爾(真假) -
int
—— 整數 -
float
—— 浮點數(小數)
2、在 Python
中定義變量時需要指定類型嗎?
- 不需要
-
Python
可以根據=
等號右側的值,自動推導出變量中存儲數據的類型
- 字符串是一種什麼結構?它能不能被修改?
- 字符串是一種序列類型
- 字符串不能被修改
1.8 拓展知識
常見錯誤類型
SyntaxError: unexpected EOF while parsing
語法錯誤,多了無法解析的符號,檢查一下是否多了或者少了括號
SyntaxError: invalid character in identifier
語法錯誤有無效標識符,檢查一下中文符號
IndexError: list index out of range
索引錯誤,超出索引範圍,檢查一下列表是否爲空
TypeError: must be str, not int
數據類型錯誤,該數據不是正確的數據類型,比如字符串和數字直接拼接,檢查一下數據類型
IndentationError: expected an indented block
縮進錯誤,檢查一下代碼的縮進是否正確
KeyError: 'fond'
鍵錯誤,字典中沒有該的key對應的值,檢查一下鍵名或者字典數據是否正確
ValueError: substring not found
值錯誤,輸入的數據類型跟要求的不符合
NameError: name 'a' is not defined
未初始化對象,變量沒有被定義
AttributeError: 'tuple' object has no attribute 'remove'
屬性錯誤,該對象沒有這個屬性、方法,檢查一下數據類型
SystemExit
解釋器請求退出,出現在exit()函數後
IOError
輸入/輸出操作失敗
ImportError
導入模塊/對象失敗,檢查一下模塊是否能夠正常使用
UnicodeDecodeError/UnicodeEncodeError/UnicodeTranslateError
Unicode 解碼/編碼/轉換/時的錯誤
成員運算符
in
和 not in
被稱爲 成員運算符
成員運算符用於 測試 序列中是否包含指定的 成員
運算符 | 描述 | 實例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否則返回 False |
3 in '123' 返回 True
|
not in | 如果在指定的序列中沒有找到值返回 True,否則返回 False |
3 not in '123' 返回 False
|
身份運算符
is 比較的是兩個實例對象是不是完全相同,它們是不是同一個對象,佔用的內存地址是否相同。萊布尼茨說過:“世界上沒有兩片完全相同的葉子”,這個is正是這樣的比較,比較是不是同一片葉子(即比較的id是否相同,這id類似於人的身份證標識)。
身份運算符用於比較兩個對象的存儲單元
運算符 | 描述 | 實例 |
---|---|---|
is | is 是判斷兩個標識符是不是引用自一個對象 | x is y, 類似 id(x) == id(y) , 如果引用的是同一個對象則返回 True,否則返回 False |
is not | is not 是判斷兩個標識符是不是引用自不同對象 | x is not y , 類似 id(a) != id(b)。如果引用的不是同一個對象則返回結果 True,否則返回 False。 |
id() 函數用於獲取對象內存地址。
身份運算符案例:
# %% 身份運算符
one = 1
o = 1
print(o is one) # 變量駐存在內存中
a1 = [1]
a2 = [1]
print(a1 is a2)
print(id(o), id(one))
print(id(a1), id(a2))
# is 與 ==
print(a1 is a2)
print(a1 == a2)
字符串格式化
# 對齊輸出
# 左對齊 utf-8 萬國碼
In [5]: '{a:<10}'.format(a=12.3,b=13.44)
Out[5]: '12.3 '
# 數字補x (填充右邊, 寬度爲10)
In [6]: '{a:0<10}'.format(a=12.3,b=13.44)
Out[6]: '12.3000000'
# 兩邊對齊...
In [7]: '{a:0^10}'.format(a=12.3,b=13.44)
Out[7]: '00012.3000'
# 保留小數點後兩位
In [1]: '{:.2f}'.format(12.333)
Out[1]: '12.33'
In [2]: '{a:.2f}'.format(a=12.333)
Out[2]: '12.33'
In [3]: '{a:6.2f}'.format(a=12.333)
Out[3]: ' 12.33'