【Python】基礎總結

輸入

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定義的普通函數