本系列旨在快速掌握Python,實現能夠快速閱讀和理解 Python 代碼,并在可查閱語法的情況下進行 AI 學習。
本篇先了解一下Python基礎知識。
本篇內容較菜鳥教程有所刪減、方便快速構建大綱,且加入了PEP 8規范說明等有助于理解和編寫代碼的說明。
因為是Java程序員視角學習Python,所以會有一些與Java的比較。
目錄
- 資料推薦
- Python格式規范
- 編碼
- PEP 8規則
- 標識符
- 注釋
- 縮進(Python怎么寫)
- Python關鍵字
- Python核心語法
- 變量與數據類型
- 基本類型
- 迭代器
- 類型轉換
- 控制流
- 函數
- 定義函數
- 參數傳遞機制
- 裝飾器
- 異常處理
- 語法
- with
- 自定義異常
- 掌握測試-使用Python來解leetcode
資料推薦
菜鳥教程
《python入門到實踐》
Python格式規范
編碼
默認情況下,Python3 源碼文件以 UTF-8 編碼,所有字符串都是 unicode 字符串。
PEP 8規則
Python官方的規范PEP 8。
里面有各種規范,這里簡單介紹一下命名規范。
-
變量
不要使用I、O字符作為單個字符變量名。
常量為大寫字母+下劃線。 -
模塊名
模塊名全小寫,下劃線分割。 -
類名
類名CapWords規范,即同Java一樣首字母大寫。
異常類后綴使用Error。 -
函數名
小寫+下劃線。
實例方法第一個參數用self。
類方法第一個參數用cls。
使用下劃線優于縮寫。 -
前導線_約定
公開屬性不應有前導下劃線_
僅對非公共方法和實例變量使用一個前導下劃線_
使用雙前導下劃線__命名可能與設計為子類的類中的屬性發生沖突的屬性。
標識符
- 第一個字符必須以字母(a-z, A-Z)或下劃線 _ 。
- 標識符的其他的部分由字母、數字和下劃線組成。
- 標識符對大小寫敏感,count 和 Count 是不同的標識符。
- 標識符對長度無硬性限制,但建議保持簡潔(一般不超過 20 個字符)。
- 禁止使用保留關鍵字,如 if、for、class 等不能作為標識符。
注釋
#!/usr/bin/python3# 第一個注釋
# 第二個注釋'''
第三注釋
第四注釋
'''"""
第五注釋
第六注釋
"""
print ("Hello, Python!")
縮進(Python怎么寫)
python最具特色的就是使用縮進來表示代碼塊,不需要使用大括號 {} 。
縮進的空格數是可變的,但是同一個代碼塊的語句必須包含相同的縮進空格數。
縮進一致默認為同一個代碼快,使用反斜杠\可以實現多行語句。
Python換行不需要使用分號;來標識結束。
Python關鍵字
python關鍵字可以使用下列代碼打印出來。
import keywordprint(keyword.kwlist)
[‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘async’, ‘await’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]
Python核心語法
變量與數據類型
字符串、數字、列表、元組、字典、集合(重點:列表和字典,類似Java的List和Map)。
基本類型
python的變量不需要聲明,類型在運行時自動推斷,且可隨時改變。即動態類型特征。
x = 10
# 整數轉換成字符串
x = "hello"
Java10+開始支持var關鍵字,支持局部變量類型推斷,但是不同的是Java的var聲明后類型不可以更改。
類型可以隨時更改,但是內容不一樣。
Python3 的六個標準數據類型中:
- **不可變數據(3 個):Number(數字)、String(字符串)、Tuple(元組);
- **可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)。
不可變immutable的類型一旦創建,內部內容不可修改,修改操作實際上是創建了一個新的對象。
a = "hello"
a += " world" # 實際是新建了一個字符串對象,a 指向新對象
可變mutable的類型內部內容可直接修改,而對象本身(內存地址)不變。
- Tuple示例
元組中的元素類型也可以不相同。有序。
tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2 )
- List示例
和Java不一樣,Python的List可存放任意類型(動態類型),運行時動態推斷,無編譯時類型約束。
Java的List存Object是編譯時類型擦除,需要保證是Object子類,沒有Python的靈活。
Python的List是有序的。
list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ] # 定義一個列表
- Dictionary示例
字典是無序的對象集合。鍵值對。
tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}
- Set示例
Python 中的集合(Set)是一種無序、可變的數據類型,用于存儲唯一的元素。
sites = {'Google', 'Taobao', 'Runoob', 'Facebook', 'Zhihu', 'Baidu'}
迭代器
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
迭代器有兩個基本的方法:iter() 和 next()。
字符串,列表或元組對象都可用于創建迭代器:
list = [1,2,3,4]
# 通過iter方法創建迭代器對象
it = iter(list)
# 使用next()方法獲取元素
print(next(it))
類似Java需要實現Iterator接口的hasNext()與next(),Python一個類需要作為迭代器使用需要在類中實現__iter__()與__next__()方法。
類型轉換
以下幾個內置的函數可以執行數據類型之間的轉換。這些函數返回一個新的對象,表示轉換的值。
函數 | 描述 |
---|---|
int(x [,base]) | 將x轉換為一個整數 |
float(x) | 將x轉換到一個浮點數 |
complex(real [,imag]) | 創建一個復數 |
str(x) | 將對象 x 轉換為字符串 |
repr(x) | 將對象 x 轉換為表達式字符串 |
eval(str) | 用來計算在字符串中的有效Python表達式,并返回一個對象 |
tuple(s) | 將序列 s 轉換為一個元組 |
list(s) | 將序列 s 轉換為一個列表 |
set(s) | 轉換為可變集合 |
dict(d) | 創建一個字典。d 必須是一個 (key, value)元組序列。 |
frozenset(s) | 轉換為不可變集合 |
chr(x) | 將一個整數轉換為一個字符 |
ord(x) | 將一個字符轉換為它的整數值 |
hex(x) | 將一個整數轉換為一個十六進制字符串 |
oct(x) | 將一個整數轉換為一個八進制字符串 |
函數轉換為顯示轉換。 |
在隱式類型轉換中,Python 會自動將一種數據類型轉換為另一種數據類型,不需要我們去干預。
在使用上,Python的隱式類型轉換和Java的自動類型轉換效果一樣。
即較小類型轉換成較大類型以避免精度丟失,如int轉double。
都不允許使用不安全活不合理的轉換,如字符串直接轉數字。
兩者在使用上差別為Python支持布爾值轉換,布爾值在算術中隱式轉為int(True為1,False為0)。
Java不支持布爾值轉換,有限轉換類型為byte → short → int → long → float → double。
控制流
if、for、while(Python的循環比Java簡潔,注意縮進)。
- if
if condition_1:statement_block_1
elif condition_2:statement_block_2
else:statement_block_3# python3.10新增 match...case 類似Java switch case
match subject:case <pattern_1>:<action_1>case <pattern_2>:<action_2>case <pattern_3>:<action_3>case _:<action_wildcard> # _ 可以匹配一切。 類似default
- for
python提供了for…else寫法,else在for結束后執行一次。相當于與finally
for <variable> in <sequence>:<statements>
else:<statements>
- while
python提供了while…else寫法,else執行一次。想當于while+if else
while 判斷條件(condition):執行語句(statements)……while counter <= n:sum = sum + countercounter += 1# 或者
while <expr>:<statement(s)>
else:<additional_statement(s)>
Python的continue和break與Java使用相同。
函數
定義、參數(默認參數、可變參數)、lambda表達式。
定義函數
可以使用def關鍵字定義一個完成函數。
![[Pasted image 20250414133812.png]]
也可以使用lambda來創建一個匿名函數,一般是簡單的、單行的函數,通常在需要函數作為參數傳遞的情況下使用。
lambda arguments: expression
# 無參
f = lambda: "Hello, world!"
print(f()) # 輸出: Hello, world!
# 有參
x = lambda a, b : a * b
print(x(5, 6))
lambda 函數通常與內置函數如 map()、filter() 和 reduce() 一起使用,以便在集合上執行操作。例如:
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 輸出: [1, 4, 9, 16, 25]
參數傳遞機制
Java嚴格采用值傳遞(Pass by Value),對象類型傳遞引用的副本。因此,Java函數內修改傳遞的值不會修改原值,通過傳遞的引用修改對象內容會影響原對象,將引用副本指向新的對象不會影響原應用。
Python的參數傳遞與Java一致。不可變對象表現為值傳遞,可變對象表現為“傳遞引用副本”。
裝飾器
裝飾器(decorators)是 Python 中的一種高級功能,它允許你動態地修改函數或類的行為。
![[Pasted image 20250414140726.png]]
類似于Java的注解。
多個裝飾器堆疊在一起,從下到上??順序依次應用。
異常處理
語法
語法try-except(類似Java的try-catch)。
def test_func():while True:try:x = int(input("請輸入一個數字: "))breakexcept ValueError as err:print("您輸入的不是數字,請再次嘗試輸入!")test_func()
和Java一樣,一個try可以對應多個except。
語法try/except…else。else 子句放在最后,將在 try 子句沒有發生任何異常的時候執行。
try-finally 語句。和Java的finally一樣,是否發生異常都將執行最后的代碼。
Python 使用 raise 語句拋出一個指定的異常。
raise [Exception [, args [, traceback]]]# 使用raise拋出異常
x = 10
if x > 5:raise Exception('x 不能大于 5。x 的值為: {}'.format(x))
僅使用raise關鍵字相當于直接拋出。
with
Python的with關鍵字類似Java的 try-with-resources 。語法如下:
# 文件操作(自動關閉)
with open('file.txt', 'r') as file:data = file.read()# 文件會在代碼塊結束后自動關閉,即使發生異常
類似的是Java使用try-with-resources 需要類實現了AutoCloseable接口,而Python的需要實現__enter__ 和 exit。
自定義異常
異常類需要繼承Exception。
class MyError(Exception):def __init__(self, value):self.value = valuedef __str__(self):return repr(self.value)
大多數的異常的名字都以"Error"結尾,就跟標準的異常命名一樣。這里類繼承相關件后續Python面向對象篇章。
掌握測試-使用Python來解leetcode
每天用Python刷兩道簡單LeetCode維持手感。
下篇[Python基礎速成]2-模塊與包與OOP