python編程基礎(一)
- 語句和語法
- 變數賦值
- 基本風格指南
- 內存管理
- 第一個python程序
- (#)井號表示之後為字元為python的注釋
- (n)換行是標準的行分隔符
- ()反斜線表示繼續上一行
- (;)表示將兩個語句連在一行中
- (:)冒號表示將代碼塊的頭和體分開
- 語句(代碼塊)用於縮進的方式體現
- 不同的縮進深度分隔不同的代碼塊
- python文件以模塊的形式組織
3.1.4代碼組不同的縮進分隔
python使用縮進來分隔代碼組。代碼的層次關係是通過同樣深度的空格或製表符的縮進體現。同一代碼組的代碼必須嚴格左對齊。核心風格:縮進4個空格寬度,避免使用製表符。隨著縮進深度的增加,代碼塊的層次也在增加,沒有縮進的代碼塊是最高的層次的,被稱之為主體(main)部分。3.1.5同一行書寫多個語句(;)(;)分號允許你在同一行書寫多個語句,之間用分號隔開。這些語句不能再這行開始的一個新的代碼塊。例子:import sys;x=foo;sys.stdout.write(x+n)n
3.1.6模塊
每個python腳本都可以被當做一個模塊。模塊以磁碟文件的形式存在。當一個模塊。當一個模塊過大,並且驅動了很多功能的話,就應該考慮拆一些代碼出來另外建一個模塊。模塊裡面代碼可以是一段直接可執行的腳本,也可以是一堆類似庫函數的代碼,從而可以被別的模塊導入(import)調用。
3.2 變數賦值3.2.1賦值操作符python語言中,等號(=)是主要的賦值操作符(其他的是增量操作符)如:anInt=12n
在python語言中,對象是通過引用傳遞的。python的賦值語句不會返回值。
>>> x=1n>>> y=(x=x+1)t#賦值語句不是合法表達式nSyntaxError: invalid syntaxnn>>> y=x=x+1n>>> x,yn(2, 2)n
x=x+1n
等價於
x+=1n
增量賦值符,其一是寫法上的簡化,其二是第一個對象進被處理一次。
可變對象唄修改,不可變對象則和A=A+B的結果一樣。
>>> m=12n>>> m%=7n>>> mn5n>>> m**=2n>>> mn25n>>> aList=[123,xyz]n>>> aList+=[45.6e7]n>>> aListn[123, xyz, 456000000.0]n
>>> x=y=z=1n>>> xn1n>>> yn1n>>> zn1n
該對象的同一個引用被賦值給x、y、z
3.2.4 "多元"賦值將多個變數同時賦值的方法我們稱之為多元賦值(multuple)>>> (x,y,z)=(1,2,a string)n>>> xn1n>>> yn2n>>> zna stringn
兩個整型和一個字元串分別被賦值給x、y、z
python的多元賦值方法可以實現無需中間變數交換。3.3標識符3.3.1合法的python標識符python的標識符規則和其他大部分用C編寫的高級語言類似:
- 第一個字元必須是字母或者下劃線(_)
- 剩下的字元可以是字元和數字或下劃線。
- 大小寫敏感
- _xxx 不用『from module import *』導入
- _xxx_t 系統定義名字
- _xxx 類中的私有變數名
核心風格:避免下劃線作為變數名的開始
3.4基本風格指南注釋確保注釋的準確性。注釋對自己和他人都很重要。文檔python提供了一個機制,可通過__doc__特別變數,動態獲得文檔字串。在模塊、類聲明、或函數聲明第一個沒有賦值的字元串可以用屬性obj.__doc__來訪問。obj是一個模塊、類、或函數的名字。縮進縮進對其十分重要,增強代碼可讀性。不要使用製表符。選擇標識符名稱選擇短的有意義的標識符。
python風格指南3.4.1模塊的結構和布局用模塊來合理組織你的python代碼是簡單又自然的方法。如下面的布局:#(1)起始行#(2)模塊文檔#(3)模塊導入#(4)變數定義#(5)類定義#(6)函數定義#(7)主程序
(1)起始行通常只在類unix環境下使用。(2)模塊文檔簡要介紹模塊的功能及重要全局變數的含義,模塊可通過 moudle.__doc__訪問這些內容#/usr/bin/env python (1)起始行"this is a test module" (2)模塊文檔import sysimport os (3)模塊導入debug=True (4)(全局)變數class FooClass(object):
"Foo class"passtttt (5)類定義def test(): "test function" foo=FooClass() if debug: print ran test() (6)函數定義(若有)of __name__==__main__: test() (7)主程序(3)模塊導入導入當前模塊的代碼需要的所有模塊,每個模塊僅導入一次(當前模塊載入時);函數內部的模塊導入代碼不會被執行,除非該函數正在執行。(4)變數定義這裡定義的變數為全局變數,本模塊中的所有函數都可以直接使用。盡量使用局部變數代替全局變數,代碼易維護,且提高性能節省內存。(5)類定義語句所有的類都在這裡定義,當模塊被導入時,class語句就會被執行。類也就會被定義。類的文檔變數是class.__doc__(6)函數定義語句函數語句可以通過module.function()被外部訪問到,當模塊被導入時def語句會被執行,函數也就都會定義好。函數的文檔變數是function.__doc__(7)主程序無論這個模塊是被別的模塊導入還是作為腳本直接執行,都會執行這部分代碼。核心風格:主程序調用main()函數。絕大部分模塊的創建目的是為了被別人調用而不是作為獨立執行的腳本。核心風格:__name__指示模塊應如何被載入- 如果模塊是被導入,__name__的值為模塊名字
- 如果模塊是被直接執行,__name__的值為『 __main__ 』
- 變數無須事先聲明
- 變數無須指定類型
- 程序員不用關心內存管理
- 變數名會被「回收」
- del語句能夠直接釋放資源
>>> annTraceback (most recent call last):nFile "<pyshell#0>", line 1, in <module>nanNameError: name a is not definedn
變數一旦被賦值,就可以直接通過變數名來訪問他們。
>>> x=4n>>> y=this is a stringn>>> xn4n>>> ynthis is a stringn
3.5.2 動態類型
python無須類型聲明。3.5.3 內存分配底層的事情交給python解釋器去做就可以了。3.5.4 引用計數要追蹤內存中的對象,python引用了計數這一簡單技術。1.增加引用計數2.減少引用計數3.del語句3.5.5垃圾收集不再使用的內存被一種稱之為垃圾收集的機制釋放。3.6第一個python程序例3-1 創建文件(makeTextFile.py)這個腳本是在提醒用戶輸入一個(尚不存在)的文件名,然後由用戶輸入該文件的每一行。最後,將所有的文本寫入文本文件。#!usr/bin/env/pythonnnmakeTextFile.py--create text filennimport osnls=os.linesepnn#get filenamenwhile True:nnif os.path.exists(fname):nprint "ERROR: %s already exists" % fnamenelse:nbreaknn#get file content(text) linesnall=()nprint "nEnter lines ( . by itself to quit).n"nn#loop until user terminates inputnwhile True:nentry=raw_input(>)nif entry== . :nbreaknelse:nall.append(entry)nn#write lines to file with proper line-endingnfobj=open(fname,w)nfobj.writelines([%s%s %(x,ls) for x in all])nfobj.close()nprint DONE!n
- python對象
- 內建類型
- 標準類型操作符
- 值的比較
- 對象身份比較
- 布爾類型
- 標準類型內建函數
- 標準類型總覽
- 各種類型
- 不支持的類型
- 數字
- Integer 整型
- Boolean 布爾型
- Long Integer 長整型
- Floating point real number 浮點型
- Complex number 複數型
- String 字元串
- List 列表
- Tuple 元組
- Dictionary 字典
- 類型
- Null對象(None)
- 文件
- 集合/固定集合
- 函數/方法
- 模塊
- 類
>>> type(32)n<type int>n
<type int>是一個類型對象。
>>> type(type(32))n<type type>n
所有類型對象的類型都是type,它是所以python類型對象的根和所有python標準類的默認元類(metaclass)。
4.3.2 None——Python的Null對象Python有一個特殊對象,被稱為Null對象或NoneType,它只有一個值,那就是None。不支持任何運算也沒用任何內建方法。None沒有任何屬性,布爾值為False核心筆記:布爾值。所有標準對象均可用於布爾測試,同類型的對象之間可以比較大小。每個對象天生具有布爾True和False下面的對象布爾值為False:- None
- False(布爾類型)
- 所有值為零的數
- 0(整型)
- 0.0(浮點型)
- 0L(長整型)
- 0.0+0.0j(複數)
- ""(空字元)
- [](空列表)
- ()(空元組)
- {}(空字典)
- 代碼
- 幀
- 跟蹤記錄
- 切片
- 省略
- Xrange
>>> f=abcdefn>>> f[::-1]nfedcban>>> f[::-2]nfdbn>>> fr=[123,abc,123.456,qwe]n>>> fr[::-1]n[qwe, 123.456, abc, 123]n
>>> 2==2nTruen>>> 2==3nFalsen>>> abc<xyznTruen>>> abc>xyznFalsen>>> [5,abc]== [5,abc]nTruen>>> [5,abc]== [abc,5]nFalsen
>>> x,y=3.1415926,-1024n>>> x<5.0nTruen>>> not (x<5.0)nFalsen>>> (x<5.0 )or (y>2.71828)nTruen>>> (x<5.0 ) and (y>2.71828)nFalsen>>> not (x is y)nTruen
type(object)n
type()接受一個對象作為參數,並且返回他的類型,它的返回值是一個類型對象。
>>> type(4)t#整型n<type int>n>>> type(Hello World!)t#字元型n<type str>n>>> type(type(4))t#type類型n<type type>n
>>> cmp(a,b)n-1n>>> cmp(b,a)n1n>>> b=-4n>>> cmp(a,b)n0n
>>> str(4.53)n4.53n>>> str(1)n1n>>> str(2e10)n20000000000.0n>>> str([0,1,2,3])n[0, 1, 2, 3]n>>> repr(1)n1n>>> repr([0,1,2,3,4])n[0, 1, 2, 3, 4]n>>> `[0,1,2,3]`n[0, 1, 2, 3]n
repr()和(` `)做的事情幾乎完全一樣,返回一個對象的「官方」字元串表示。可以同eval()重新得到該對象。
str()則是致力於生產一個對象的可讀性好的字元串表示,適用於print()語句。並非所有的repr()返回的字元串都可以用eval()內建函數來得到原來的對象。>>> eval(`type(type)`)nnTraceback (most recent call last):nFile "<pyshell#24>", line 1, in <module>neval(`type(type)`)nFile "<string>", line 1n<type type>n^nSyntaxError: invalid syntaxn
為什麼我們有了repr()函數還需要(``)
因為某些場合函數會比操作符更適合使用。(現在不鼓勵使用(``))4.6.4 type()和isinstance()>>> type()n<type str>n>>> s=xyzn>>> type(s)n<type str>n>>> type(0+0j)n<type complex>n>>> type([])n<type list>n>>> type({})n<type dict>n>>> type(0.0)n<type float>n>>> type(0L)n<type long>n
>>> x=pythonn>>> print id(x)n23849088n>>> x=what?n>>> print id(x)n30706720n>>> i=0n>>> print id(i)n23945996n
對象實際上對替換了。
>>> List=[abd,65,34,dad]n>>> Listn[abd, 65, 34, dad]n>>> List[2]n34n>>> id(List)n30671536n>>> List[2]=List[2]+1n>>> List[3]=dsrgen>>> Listn[abd, 65, 35, dsrge]n>>> id(List)n30671536n
列表的值不論如何變換,列表的ID始終不變。
4.8.3 訪問模型4.9 不支持的類型下面給出python目前還不支持的數據類型。1. char和bytepython沒有char或byte類型來保存單一字元或8位整型2. 指針python替你管理內存,沒必要訪問指針3. int vs short vs longpython的整型相當於C語言中的長整型4. float vs doublepython的浮點型實際上是C語言的雙精度浮點型第5章 數字本章主題- 數字簡介
- 整型
- 布爾型
- 標準整型
- 長整型
- 浮點型實數
- 複數
- 操作符
- 內建函數
- 其他數字類型
- 相關模塊
anInt=1naLong=-999999999LnaFloat=3.141592653naComplex=1.23+4.56Jn
>>> aLong=999999991n>>> aLong=99999999Ln>>> print aLongn99999999n
>>> aComplex=-8.333-1.47jn>>> aComplexn(-8.333-1.47j)n>>> aComplex.realn-8.333n>>> aComplex.imagn-1.47n>>> aComplex.conjugate()n(-8.333+1.47j)n
num.real ttt複數的實部
num.imag ttt複數的虛部num.conjugate()tt複數的共軛複數5.5 操作符5.5.1 混合模式操作符類型轉換基本原則:整型轉換為浮點型,非複數轉換為複數>>> 5+1.5n6.5n
>>> -719>=920nFalsen>>> 2<5<8nTruen>>> 0.<-90.4<55.3e2!=3<181nFalsen>>> (-1<1) or (1<-1)nTruen
>>> -422-77n-499n>>> 4**5n1024n>>> 8/3n2n>>> 8.0/3.0n2.6666666666666665n>>> 8%3n2n>>> 45L*25Ln1125Ln>>> 0x80+0777n639n>>> 0+1j**2n(-1+0j)n
>>> 30&45n12n>>> 30|45n63n>>> 30&30n30n>>> 30|30n30n>>> ~30n-31n>>> ~45n-46n>>> 45<<22n188743680n>>> 45<<1n90n>>> 30^2n28n
>>> cmp(-6,2)n-1n>>> cmp(0xFF,255)n0n>>> type(int)n<type str>n>>> type(2-1j)n<type complex>n
>>> int(4.25555)n4n>>> long(42)n42Ln>>> float(4)n4.0n>>> complex(4)n(4+0j)n>>> complex(2.4,-8)n(2.4-8j)n>>> complex(2.3e-10,45.3e4)n(2.3e-10+453000j)n
>>> abs(-1)n1n>>> abs(-10.)n10.0n>>> abs(1.2-2.1j)n2.4186773244895647n
>>> coerce(1,2)n(1, 2)n>>> coerce(1.3,134L)n(1.3, 134.0)n>>> coerce(1j,134L)n(1j, (134+0j))n
>>> coerce(1j,134L)n(1j, (134+0j))n>>> divmod(10,3)n(3, 1)n>>> divmod(3,10)n(0, 3)n>>> divmod(2.5,10)n(0.0, 2.5)n>>> divmod(2+1j,0.5-1j)n((-0+0j), (2+1j))n
pow()和(**)都可以進行指數操作,只是前者是內建函數,後者是操作符
>>> pow(2,5)n32n>>> pow(3.1415,4)n97.39760017099509n>>> pow(1+1j,3)n(-2+2j)n
>>> round(3)n3.0n>>> round(3.4444)n3.0n>>> round(3.4999999,1)n3.5n>>> round(3.449999)n3.0n
- 函數int()直接截取小數部分(返回值為整型)
- 函數floor()得到最接近原數的但小於原數的整型(返回值為浮點型)
- 函數round()得到最接近原數的整型(返回值為浮點型)
>>> hex(255)n0xffn>>> oct(255)n0377n
>>> chr(88)nXn>>> chr(44L)n,n>>> ord(g)n103n>>> ord(D)n68n
- 有兩個永不改變的True和False
- 布爾型是整型的子類,但不能再被繼承而生成它的子類。
- 對於值為零的任何數字或空集在python中的布爾值都是False
- 數學運算中,Boolean值的True和False分別對應為1和0
#intron>>> bool(1)nTruen>>> bool(0)nFalsen>>> bool(1)nTruen>>> bool(0)nTruen>>> bool([])nFalsen
#使用布爾數n>>> foo=42n>>> bar=foo<100n>>> barnTruen>>> print bar+100n101n>>> print %s % barnTruen>>> print %d % barn1n
>>> from decimal import Decimaln>>> dec Decimal(.1)nSyntaxError: invalid syntaxn>>> dec=Decimal(.1)n>>> decnDecimal(0.1000000000000000055511151231257827021181583404541015625)n>>> print decn0.1000000000000000055511151231257827021181583404541015625n>>> dec=Decimal(.1)n>>> decnDecimal(0.1)n>>> print decn0.1n
5.8相關模塊
對數字科學計算應用來說,有第三方包(Numeric(Numpy))和Scipy聲明:
以上學習筆記來自
《python核心編程》第2版 Wesley J.Chun 編著 宋吉廣譯 人民郵電出版社
推薦閱讀:
※配置IPython Notebook提供非本地訪問
※構建PyQt5.8/Python2.7
※Kivy中文編程指南:事件和屬性
※分享一個簡單的多進程小爬蟲
※第一章 | 使用python機器學習
TAG:Python |