輸入
input("提示性資訊")
如:
input("請輸入數字")
評估函式
因為 Python 沒有特別人為規定資料型別,資料型別是由計算機進行判定,所以我們 input()
輸入的資料均預設作為字串處理,而如果要輸入一些數字,著需要 eval()
評估函式對字串進行評估,化為語句(數字)。
評估函式:去掉引數最外側引號並執行餘下語句的函式,即 字串 → 語句。
例如:
eval("1")
→ 1
eval("1+2")
→ 3
eval('"1+2"')
→ '1+2'
eval('print("hello")')
→ hello
輸出
print(...)
預設空一行,如果想不空行,則
print(...., end = "")
數字型別
整數型別
與數學中整數的概念一致。
特性:
- 可正可負,沒有取值範圍限制
pow(x, y)
函式:計算\(x^y\),想算多大算多大
進位制:
- 十進位制:1010,99,-217
- 二進位制:以 0b 或 0B 開頭:0b010,-0B101
- 八進位制:以 0o 或 0O 開頭:0o123,-0O456
- 十六進位制:以 0x 或 0X 開頭:0x9a,-0X89
浮點數型別
與數學中實數的概念一致。
特性:
- 帶有小數點及小數的數字
- 浮點數取值範圍和小數精度都存在限制,但常規計算可忽略
- 取值範圍數量級約為\(-10^{307}\)至\(10^{308}\),精度數量級\(10^{-16}\)
- 浮點數間運算存在不確定尾數,不是 bug
不確定尾數
浮點數間運算存在不確定尾數,不是 bug
如:0.1+0.3 → 0.4
0.1+0.2 → 0.30000000000000004
這是由於在計算機中一切資料都是化為二進位制進行儲存的,而有的浮點數並不能完全化為相等的二進位制數,只能無限趨近於二進位制數。
如:0.1 →
- 二進位制表示:0.00011001100110011001100110011001100...等 53位二進位制表示小數部分,約 \(10^{-16}\)
十進位制表示:0.10000000000000000555111512312578270...
注意:二進位制表示小數,可以無限接近,但不完全相同。
例如,0.1+0.2 結果無限趨近 0.3,但是可能存在尾數。
四捨五入
解決方法:
- 0.1+0.2 == 0.3 → False
- round(0.1+0.2, 1) == 0.3 → True
四捨五入:
round(x, d)
:對 x 四捨五入,d 是小數擷取位數。- 浮點數間運算與比較用 round() 函式輔助
- 不確定尾數一般發生在 \(10^{-16}\) 左右,round() 十分有效
科學計數法
浮點數可以採用科學計數法表示
使用字母 e 或 E 作為冪的符號,以 10 為基數,格式如下:
<a>e<b>
表示 \(a*10^b\)例如:4.3e-3 值為 0.0043
9.6E5 值為 960000.0
複數型別
與數學中複數的概念一致,\(j^2\) = -1
例如:z = 1.23e-4 + 5.6e+89j
z.real 獲得實部,z.imag 獲得虛部
數值運算操作符
操作符及使用 | 描述 | 備註 |
---|---|---|
x // y | 整數除 | x 與 y之整數商 10//3 結果是 3 |
x % y | 餘數,模運算 | 10%3 結果是 1 |
x ** y | 冪運算,x的y次冪,\(x^y\) | 也可以進行開方 |
+x | x 的本身 | |
-x | x 的負值 |
數字型別的關係
型別間課進行混合運算,生成結果為“最寬”型別
三種型別存在一種逐漸“擴充套件”或“變寬”的關係:
整數 → 浮點數 → 複數
例如:123+4.0 = 127.0(整數 + 浮點數 = 浮點數)
數值運算函式
函式及使用 | 描述 | 備註 |
---|---|---|
abs(x) | 絕對值,x 的絕對值 | abs(-10.01) 結果為 10.01 |
divmod(x, y) | 商餘,(x//y, x%y),同時輸出商和餘數 | divmod(10, 3) 結果為 (3,1) |
pow(x, y[,z]) | 冪餘,(x**y%z),[]表示引數z可省略 | pow(3, pow(3,99),10000) 結果為 4587 |
round(x[,d]) | 四捨五入,d 是保留小數位數,預設值為 0 | round(-10.123,2) 結果為 -10.12 |
max(x1,x2,...,xn) | 最大值,返回 x1,x2,...,xn 中的最大值,n 不限 | max(1,9,5,4,3) 結果為 9 |
min(x1,x2,...,xn) | 最小值,返回 x1,x2,...,xn 中的最小值,n 不限 | min(1,9,5,4,3) 結果為 1 |
int(x) | 將 x 變成整數,捨棄小數部分 | int(123.45)結果為123; int("123")結果為123 |
float(x) | 將 x 變成浮點數,增加小數部分 | float(12)結果為12.0; float("1.23")結果為1.23 |
complex(x) | 將 x 變成複數,增加虛數部分 | complex(4)結果為4+0j |
字串型別
字串型別的表示
字串:由 0 個或多個字元組成的有序字元序列。
特點:
字串由一對單引號或一對雙引號表示
例如:"請輸入帶有符號的溫度值:" 或者 'C'
字串是字元的有序序列,可以對其中的字元進行索引
例如:"請"是"請輸入帶有符號的溫度值:"的第 0 個字元
字串有 2 類共 4 種表示方法:
由一對單引號或雙引號表示,僅表示單行字串
例如:"請輸入帶有符號的溫度值:" 或者 'C'
由一對三單引號或三雙引號表示,課表示多行字串
例如:
'''
python
語言
'''
擴充套件:
- 如果希望在字串中包含雙引號或單引號呢?
'這裡有個雙引號(")' 或者 "這裡有個單引號(')" - 如果希望在字串中既包括單引號又包括雙引號呢?
'''這裡既有單引號(')又有雙引號(")'''
字串的序號
字串的使用
使用[]獲取字串中一個或多個字元
索引:返回字串中單個字元。[M]
例如:"請輸入帶有符號的溫度值:"[0] 或者 TempStr[-1]
切片:返回字串中一段字元子串。[M:N]
例如:"請輸入帶有符號的溫度值:"[1:3] 或者 TempStr[0:-1]
字串切片高階用法
使用[M:N:K]根據步長對字串切片
[M:N],M 缺失表示至開頭,N 缺失表示至結尾
例如:"零一二三四五六七八九十"[:3] 結果是 "零一二"
[M:N:K],根據步長 K 對字串切片
例如:"零一二三四五六七八九十"[1:8:2] 結果是 "一三五七"
"零一二三四五六七八九十"[::-1] 結果是 "十九八七六五四三二一零"
字串操作符
操作符及使用 | 描述 |
---|---|
x + y | 連線兩個字串 x 和 y |
x*n 或 n*x | 複製 n 次字串 x |
x in s | 如果 x 是 s 的子串,返回 True,否則返回 False |
字串處理函式
函式及使用 | 描述 | 備註 |
---|---|---|
len(x) | 長度,返回字串 x 的長度 | len("一二三456")結果為6 |
str(x) | 任意型別 x 所對應的字串形式 | str(1.23)結果為"1.23" str([1,2])結果為"[1,2]" |
oct(x) | 整數 x 的八進位制小寫形式字串 | oct(425)結果為"0o651" |
hex(x) | 整數 x 的十六進位制小寫形式字串 | hex(425)結果為"0x1a9" |
chr(u) | x 為 Unicode 編碼,返回其對應的單字元 | |
ord(x) | x 為字元,返回其對應的 Unicode編碼 |
字串處理方法
方法及使用 | 描述 | 備註 |
---|---|---|
str.lower() | 返回字串的副本,全部字元小寫 | "AbCdEfGh".lower()結果為"abcdefgh" |
str.upper() | 返回字串的副本,全部字元大寫 | |
strsplit(sep=None) | 返回一個列表,由 str 根據 sep 被分隔的部分組成 | "A,B,C".split(",")結果為['A','B','C'] |
str.count(sub) | 返回子串 sub 在 str 中出現的次數 | "an apple a day".count("a")結果為4 |
str.replace(old, new) | 返回字串 str 副本,所有 old 子串被替換為 new | "python".replace("n", "n123.io")結果為"python123.io" |
str.center(width[,fillchar]) | 字串 str 根據寬度 width 居中,fillchar 可選 | "python".center(20,"=")結果為"=======python=======" |
str.strip(chars) | 從 str 中去掉在其左側和右側 chars中列出的字元 | "= python=".strip(" =np")結果為"ytho" |
str.join(iter) | 在 iter 變數除最後元素外每個元素後增加一個 str | ",".join("12345")結果為"1,2,3,4,5" |
字串型別的格式化
格式化是對字串進行格式表達的方式
- 字串格式化使用.format()方法,用法如下:
.format()
槽內部對格式化的配置方式
{:}
: | <,> | <.精度> | ||||
---|---|---|---|---|---|---|
引號符號 | 用於填充的單個字元 | < 左對齊> 右對齊^ 居中對齊 |
槽設定的輸出寬度 | 數字的千位分隔符 | 浮點數小數精度 或 字串最大輸出長度 | 整數型別b ,c ,d ,o ,x ,X 浮點數型別 e ,E ,f ,% |
填充、對齊、寬度這三個一組,例如:
"{0:=^20}".format("PYTHON")
→ '=======PYTHON======='
"{0:*>20}".format("BIT")
→ '*****************BIT'
"{:10}".format("BIT")
'BIT '
剩下的三個一組,例如:
"{0:,.2f}".format(12345.6789)
→ '12,345.68'
"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}x".format(425)
→ '110101001,Σ,425,651,1a9,1A9'
"{0:e},{0:E},{0:f},{0:%}".format(3.14)
'3.140000e+00,3.140000E+00,3.140000,314.000000%'
異常處理
try:
# 執行1
<語句塊1>
except [<異常型別>]:
# 如果出現異常執行2
<語句塊2>
[else:]
# 否則,不發生異常執行3
<語句塊3>
[finally:]
# 最後執行4,一定執行
<語句塊4>
使用 raise
語句丟擲一個指定的異常。
raise [Exception [, args [, traceback]]]
分支結構
二分支結構
緊湊形式:適用於簡單表示式的二分支結構
<表示式1> if <條件> else <表示式2>
例如:
guess = eval(input())
print("猜{}了".format("對" if guess==99 else "錯"))
多分支結構
if
elif
else
迴圈結構
遍歷迴圈
for <迴圈變數> in <遍歷結構> :
<語句塊>
- 從遍歷結構中逐一提取元素,放在迴圈變數中
- 由保留字for和in組成,完整遍歷所有元素後結束
- 每次迴圈,所獲得元素放入迴圈變數,並執行一次語句塊
計數迴圈(N次)
for i in range(N) :
<語句塊>
- 遍歷由
range()
函式產生的數字序列,產生迴圈
例如:
for i in range(5):
print("Hello:",i)
執行結果:
Hello: 0
Hello: 1
Hello: 2
Hello: 3
Hello: 4
計數迴圈(特定次)
for i in range(M,N,K) :
<語句塊>
- 遍歷由
range()
函式產生的數字序列,產生迴圈
例如:
for i in range(1,6,2):
print("Hello:",i)
執行結果:
Hello: 1
Hello: 3
Hello: 5
字串遍歷迴圈
for c in s :
<語句塊>
- s是字串,遍歷字串每個字元,產生迴圈
例如:
for c in "Python123":
print(c, end=",")
執行結果:
P,y,t,h,o,n,1,2,3,
列表遍歷迴圈
for item in ls :
<語句塊>
- ls是一個列表,遍歷其每個元素,產生迴圈
例如:
for item in [123, "PY", 456] :
print(item, end=",")
執行結果:
123,PY,456,
檔案遍歷迴圈
for line in fi :
<語句塊>
- fi是一個檔案識別符號,遍歷其每行,產生迴圈
例如:
for line in fi :
print(line)
執行結果:
優美勝於醜陋
明瞭勝於隱晦
簡潔勝於複雜
無限迴圈
由條件控制的迴圈執行方式
while <條件> :
<語句塊>
- 反覆執行語句塊,直到條件不滿足時結束
例如:
a = 3
while a > 0 :
a = a - 1
print(a)
執行結果:
2
1
0
擴充套件
for <變數> in <遍歷結構> :
<語句塊1>
else :
<語句塊2>
while <條件> :
<語句塊1>
else :
<語句塊2>
- 當迴圈沒有被break語句退出時,執行else語句塊
- else語句塊作為"正常"完成迴圈的獎勵
- 這裡else的用法與異常處理中else用法相似
例如:
for c in "PYTHON" :
if c == "T" :
continue
print(c, end="")
else:
print("正常退出")
執行結果:
PYHON正常退出
例如:
for c in "PYTHON" :
if c == "T" :
break
print(c, end="")
else:
print("正常退出")
執行結果:
PY
函式
- 函式定義時可以為某些引數指定預設值,構成可選引數
- 函式定義時可以設計可變數量引數,即 不確定引數總數量
- 函式呼叫時,引數可以按照位置或名稱方式傳遞,如 f(1, 2) → f(m=1, n=2)
- 函式可以返回 0 個或多個結果(元組型別)
def <函式名>(<非可選引數> [,<可選引數>, <可變引數>]) :
<函式體>
return <返回值>
可選引數例如:
def f(m, n=1)
return m+n
print(f(1))
執行結果:
2
可變引數例如:
def f(*b):
sum = 0
for item in b:
sum += item
return sum
print(f(1,2,3,4,5))
執行結果:
15
在函式定義中,經常會碰到 *args(arguments) 和作為引數 **kwargs(keyword arguments)。
(事實上在函式中,和才是必要的,args 和 kwargs 可以用其他名稱代替)
*args 是指不定數量的非鍵值對引數。
**kwargs 是指不定數量的鍵值對引數。
*args 作為作為元組匹配沒有指定引數名的引數。而 **kwargs 作為字典,匹配指定了引數名的引數。
*args 必須位於 **kwargs 之前。
*args(*通常緊跟一個識別符號,你會看到a或者args都是識別符號)是python用於接收或者傳遞任意基於位置的引數的語法。當你接收到一個用這種語法描敘引數時(比如你在函式def語句中對函式簽名使用了星號語法),python會將此識別符號繫結到一個元祖,該元祖包含了所有基於位置的隱士的接收到的引數。當你用這種語法傳遞引數時,識別符號可以被繫結到任何可迭代物件(事實上,它也可以是人和表示式,並不必須是一個識別符號),只要這個表示式的結果是一個可迭代的物件就行。
**kwds(識別符號可以是任意的,通常k或者kwds表示)是python用於接收或者傳遞任意基於位置的引數的語法。(python有時候會將命名引數稱為關鍵字引數,他們其實並不是關鍵字--只是用他們來給關鍵字命名,比如pass,for或者yield,還有很多,不幸的是,這種讓人疑惑的術語目前仍是這門語言極其文化根深蒂固的一個組成部分。)當你接收到用這種語法描敘的一個引數時(比如你在函式的def語句中對函式簽名使用了雙星號語法)python會將識別符號繫結到一個字典,該字典包含了所有接收到的隱士的命名引數。當你用這種語法傳遞引數時,識別符號只能被繫結到字典(我ID號I它也可以是表示式,不一定是一個識別符號,只要這個表示式的結果是一個字典即可)。
當你在定義或呼叫一個函式的時候,必須確保a和k在其他所有引數之後。如果這兩者同時出現,要將k放在a之後。
區域性變數和全域性變數
- 基本資料型別,無論是否重名,區域性變數與全域性變數不同
- 可以通過 global 保留字在函式內部宣告全域性變數
組合資料型別,如果區域性變數未真實建立,則是全域性變數
解釋:組合資料型別是用指標來指明位置的,所以若區域性變數未真實建立組合資料型別,它使用的變數是指標,而指標指的是外部的全域性變數,所以你去修改指標對應的內容就修改了全域性變數。
lambda 函式
lambda函式返回函式名作為結果
- lambda函式是一種匿名函式,即沒有名字的函式
- 使用lambda保留字定義,函式名是返回結果
- lambda函式用於定義簡單的、能夠在一行內表示的函式
<函式名> = lambda <引數>: <表示式>
def <函式名>(<引數>) :
<函式體>
return <返回值>
例如:
f = lambda : "lambda函式"
print(f())
執行結果:
lambda函式
謹慎使用lambda函式
- lambda函式主要用作一些特定函式或方法的引數
- lambda函式有一些固定使用方式,建議逐步掌握
- 一般情況,建議使用def定義的普通函式