【Python學習查缺補漏】| Python基礎

編譯與解釋

執行方式 釋義 使用語言
編譯 將源代碼轉化成目標代碼的過程。執行編譯的計算機程序稱爲編譯器。 靜態語言
解釋 將源代碼逐條轉換成目標代碼同時逐條運行目標代碼的過程。執行解釋的計算機程序稱爲解釋器。優點是可以多平臺使用。 腳本(Script)語言

解釋器跨平臺使用

IPO程序編寫方法

  • 輸入數據:如文件輸入、網絡輸入、控制檯輸入、交互界面輸入、隨機數據輸入、內部參數輸入等。
  • 處理數據:程序對輸入數據進行計算產生輸出結果的過程。計算問題的處理方法統稱爲算法,它是程序最重要的組成部分。
  • 輸出數據:如控制檯輸出、圖形輸出、文件輸出、網絡輸出、操作系統內部變量輸出等。

語法元素分析

包括格式框架、註釋、變量、表達式、分支語句、循環語句、函數等。

格式框架

  • 縮進(一行代碼開始前的空白區域)表示代碼的包含和層次關係,通常1縮進=1Tab或4Space。
  • 同一行多條語句:語句間用分號;分割。
  • 一條語句多行:
    • 在一行的結尾處放置一個繼續符號\。
    • 用一對括號框起來的對象(包括數據結構和調用內容),可以在逗號,處(前/後)換行。
  • 註釋:代碼中加入的說明信息,不被執行。分單行註釋#和多行註釋’’'或"""(多行註釋相當於字符串)。
# 輸出函數內的註釋內容
def f():
	'''這是文檔註釋'''
	pass
print(f.__doc__)

標識符

用於命名對象,如各種數據類型的實例、函數、類等。

  • 標識符命名的合法規則:只由字母數字下劃線組成(python3可以使用中文字符);不以數字開頭;不能使用關鍵字;對大小寫敏感。避免使用python內存函數名。字符串可用方法isidentifier()判斷是否爲合法標識符。
    • 關鍵字/保留字:保留字一般用來構成程序整體框架、表達關鍵值和具有結構性的複雜語義等,所以不能定義與保留字相同的標識符。
  • 標識符約定命名規則:由具有意義的多個單詞組成,除第二個及以後的單詞首字母大寫,其他均小寫;類名首字母大寫;常量名全部字母大寫。
>>> help('keywords')
# Here is a list of the Python keywords.  Enter any keyword to get more help.
False               class               from                or
None                continue            global              pass
True                def                 if                  raise
and                 del                 import              return
as                  elif                in                  try
assert              else                is                  while
async               except              lambda              with
await               finally             nonlocal            yield
break               for                 not                 

變量和內部存儲規則

  • 變量應當做標識符理解。有區別其他語言的特性:
    • 變量類型不需要顯式聲明,但解釋器會根據操作自動推斷數據類型。
    • 變量類型是動態的,可以隨時變化。
    • 允許多個變量指向同一地址的對象。
  • 導致上述特性的內部存儲原因是:Python爲常量/對象開空間賦地址,標識符指向該地址,復指該地址對應的對象。所以“修改變量的值”實際上是“先爲新值開空間,再修改標識符指向的內存地址(引用)”。
  • Python是基於內存管理模式,具有自動內存管理功能,沒有任何變量指向的值會被自動刪除。當然爲了避免頻繁地申請與銷燬內存空間也有存儲優化(與解釋器環境嚴重相關,IDLE基本符合規律,Thonny維護的範圍似乎更大):
    • 小整數對象池:Z[5,256]\Z\in[-5,256],這些整數對象被提前建立好,不會被垃圾回收。
    • intern機制(字符串駐留):一般來說,長度20\le 20且只由字母數字下劃線組成的字符串會被加入字符串儲蓄池維護(字典樹維護)。
    • 特別的,字符串拼接中若涉及變量的拼接,intern機制不生效。
# IDLE環境中,關於存儲地址
>>> id(1000)
2571025206928 #是整型的實例,對象本身被存儲
>>> a=1000
>>> id(a)
2571025207024
# IDLE環境中,關於intern機制
>>> a='abc'
>>> a is 'abc'
True
>>> a+='d'
>>> a is 'abcd'
False
>>> 'abc'+'d' is 'abcd'
True

turtle模塊

查看Python說明文檔“海龜繪圖”

基本數值類型

Python內置對象{int, float, complexstr, list, tuple, dict, set函數(def定義),類(class定義)bool, 空類型None, 文件類型 \text{Python內置對象}\begin{cases} 數值類型:\text{int, float, complex}\\ 序列類型:\text{str, list, tuple, dict, set}\\ 編程單元:\text{函數(def定義),類(class定義)}\\ 其他類型:\text{bool, 空類型None, 文件類型} \end{cases}

  • 整型int
    • 可以計算、存儲任意大的數值,不用擔心溢出。
  • 浮點型float
    • 取值範圍與精度(17位)都有限制。
      • 需要捨棄部分精度時會採用科學計數法表示。
      • 基本的浮點數運算也會有誤差,受計算機用二進制存儲數據的影響。
>>> 0.1+0.3
0.4
>>> 0.1+0.2
0.30000000000000004
>>> round(0.1+0.2,2)==0.3 # 用round()取整函數消除影響
True
>>> round(0.25,1)
0.2 # 所有系統提供的四捨五入操作均有該問題
	# 否則採用int(n*(10**d)+0.5)/(10**d)獲得正確的數值
>>> 3.2%2
1.2000000000000002
  • 複數型complex
    • 形式滿足z=a+bjz=a+bjz.real返回浮點型實部,z.imag返回浮點型虛部,z.conjugate()方法返回共軛複數。
  • fractions模塊的Fraction類支持分數運算。
>>> a=Fraction(3,5)
>>> b=Fraction(3,7)
>>> a+b
Fraction(36, 35) # 支持通分
>>> a*3
Fraction(9, 5) # 支持分數與數字的跨類型運算
  • 支持在數字中間位置使用單個下劃線作爲分隔來提高數字的可讀性,類似於數學上使用逗號作爲千位分隔符。1_000_000=1000000

數值運算操作符

全部運算操作符及優先級順序參考DFGp22。特別注意成員測試運算符innot in,對象實體同一性測試(地址)運算符isis not

  • 運算中類型“寬度”(指傾向性):int<float<complex
  • 整數之間的操作符運算是否爲浮點數和複數,根據數學意義上的結果確定;浮點型參與的操作符運算至少是浮點型。
  • 取模%操作,模數和被模數都可以是浮點型。其中a%b(b<0)=[(a)%(b)(>0)]a\%b(b<0)=-[(-a)\%(-b)(>0)]
  • 結合性**和單目運算符從右向左結合,其他從左向右結合。

內置數值運算函數

常見內置函數參考DFGp15-17,查看全部內置函數和內置對象dir(__builtins__)

  • abs(x)也返回複數x的模。
  • divmod(x,y)返回(x//y,x%y)的二元組。
  • pow(x,y[,z])\Leftrightarrow(x**y)%z,支持複數(math庫的pow不支持)。
  • round(x[,ndigits])返回四捨五入{int(round(x,0))defaultnndigits>0nndigits0\begin{cases}\text{int}(\text{round}(x,0))&\text{default}\\ 小數點後n位&\text{ndigits}>0\\ 小數點前-n位& \text{ndigits}\le 0\\\end{cases}
    • round()函數還會自行捨去小數末尾多餘的0
  • 最大最小值函數有max/min(arg1, arg2, *args, *[, key=func])的使用方法。
  • 數值類型的強制類型轉化int(x), float(x), complex(re[,im])
    • 字符串轉化成數值類型中,im不可以是字符串。
    • 均可以往寬度更大的方向轉化,且不會改變實際值;complex不能轉化成int和float,float轉化成int是向下取整。

math模塊

math庫不支持複數類型!
from math import *{e, pi, inf, nan168164 \text{from math import *}\begin{cases} 數學常數:\text{e, pi, inf, nan}\\ 數值表示函數:16個\\ 冪對數函數:8個\\ 三角雙曲函數:16個\\ 高等函數:4個\\ \end{cases}

布爾型bool

  • 表達式:可計算代碼片段,由常量、變量和運算符或函數按規則構成,返回運算結果。

由表達式/操作數(包括各種非數值類型)和(關係、邏輯)運算符組成的合法布爾式,具有確定的布爾值TrueFalse。(私定義布爾式可以包含邏輯運算符and, or,表達式不可)

  • 關係運算符可以連等1<5>3合法。
  • 表達式滿足原則“非0爲真”,如0, "", [], None的布爾值都爲假False,其他爲真。
  • 數值類型與字符串型之間不可比較;字符串型比較遵循“ASCii+字典序”的原則。
  • 邏輯運算符and, or滿足“短路原則”,即在能確定布爾式值的表達式處停下,返回這個表達式的值(如果本身並不屬於布爾型,則返回原表達式)。所以後續表達式如果語法正確但有錯,是不會被檢測到的。
>>> 3<5 and a>1
NameError: name 'a' is not defined
>>> 3<5 or a>1
True
>>> not 3<5 and a>1
False
>>> [] or (1 or 5<3) #此時括號不干擾邏輯量
1

部分內置函數

常見內置函數參考DFGp15-17,查看全部內置函數和內置對象dir(__builtins__)

  • help(), dir()用來查找對象的說明文檔。
  • type(x), isinstance(obj, class_or_tuple)用來判斷數據類型。
  • int(x), float(x), complex(re[,im]), bool(x)簡單數值類型和布爾型的強制轉換函數。
  • str(x), list(iter), tuple(iter), set(iter), dict(...)複雜的工廠函數。
  • bin(x), oct(x), hex(x)十進制轉二/八/十六進制字符串。
  • ord(c)查看Unicode碼,chr(unicode)返回Unicode碼對應字母。

人機交互接口

  • input(prompt=None)
    • 用戶輸入的內容均作爲字符串對待。
    • split(sep=None, maxsplit=-1)方法對sep的情況討論:
      • sep缺省時,從空白符(如' ', '\n', '\r'等)中取出連續的元素,返回列表。取不出元素返回空列表。
      • sep有值時(不可以是空字符串),按照sep嚴格分割,首尾也考慮,返回列表。分不開元素返回只含原字符串的列表。
  • print(*objects, sep=' ', end='\n', file=sys.stdout)
  • sys模塊中sys.stdin.read(limit=-1)sys.stdin.readline(limit=-1)用於從鍵盤讀取指定數量的字符(與文件中的read系列方法區分)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章