python初步——基礎總結(一)
一. 第一個HelloWorld
1. 在linux 執行 (python2.7)
[[email protected] ~]# vim test.py #!/usr/bin/env python #---->python解釋器 # -*- coding: utf-8 -*- # ---> 字符集 print ‘Hello World‘
執行結果
# python test.py Hello World
2. 在windows pycharm 上執行
print(‘Hello World‘)
執行結果
Hello World
二. 變量
1. 聲明變量
name = ‘Sam‘ print(name)
name 為變量名,‘Sam‘ 為變量名的值
2. 變量名命名規則
變量名只能是 字母、數字或下劃線的任意組合
變量名的第一個字符不能是數字
以下關鍵字不能聲明為變量名
[‘and‘, ‘as‘, ‘assert‘, ‘break‘, ‘class‘, ‘continue‘, ‘def‘, ‘del‘, ‘elif‘, ‘else‘, ‘except‘, ‘exec‘, ‘finally‘, ‘for‘, ‘from‘, ‘global‘, ‘if‘, ‘import‘, ‘in‘, ‘is‘, ‘lambda‘, ‘not‘, ‘or‘, ‘pass‘, ‘print‘, ‘raise‘, ‘return‘, ‘try‘, ‘while‘, ‘with‘, ‘yield‘]
三. 字符集編碼
python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill)
1. ascill
ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多只能用 8 位來表示(一個字節),即:2**8 = 256-1,所以,ASCII碼最多只能表示 255 個符號。
2. 中文
big5 處理繁體中文
GB2312 1980年一共收錄了7445個字符,包括6763個漢字和682個其它符號。
GBK 1995年的漢字擴展規範GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符
GB18030 2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平臺必須支持GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支持GB2312。
GB2312 GBK GB18030 占兩個字節,並且能夠向下兼容 GB18030 --> GBK --> GB2312 --> ASCILL
3. unicode
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536
4. UTF-8
UTF-8,是對Unicode編碼的壓縮和優化,他不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存
案例
ascill 無法識別中文,會報錯
[[email protected] ~]#!/usr/bin/env python print ‘你好世界‘
告訴解釋器,用支持中文的編碼執行
[[email protected] ~]#!/usr/bin/env python # -*- coding: utf-8 -*- print ‘你好世界‘
四. 註釋
單行註釋:# 代碼是內容
快捷鍵: Ctrl + /
多行註釋:‘‘‘內容‘‘‘ 或者 """內容"""
五. 用戶輸入
[[email protected] ~]# cat test.py #!/usr/bin/env python # -*- coding: gbk -*- #name = raw_input(‘pls input your name:‘) # python 2.X name = input(‘pls input your name:‘) # python 3.X print name
[[email protected] ~]# python test.py pls input your name:高哨兵 高哨兵
註: input (2.X)==eval(input) (3.X)
raw_input 2.X == input 3.X
輸入密碼時,如果想要不可見,需要利用getpass 模塊中的 getpass方法
[[email protected] ~]# cat test.py #!/usr/bin/env python # -*- coding: gbk -*- import getpass password = getpass.getpass(‘pls input your password:‘) print password
[[email protected] ~]# python test.py pls input your password: 123456
六. 模塊
1. sys
1.1 sys.argv
[[email protected] ~]# cat test.py #!/usr/bin/env python # -*- coding: gbk -*- import sys print sys.argv # 參數列表 print sys.argv[0] print sys.argv[1]
[[email protected] ~]# python test.py aa bb [‘test.py‘, ‘aa‘, ‘bb‘] test.py aa
1.2 sys.path
[[email protected] ~]# cat test.py #!/usr/bin/env python # -*- coding: gbk -*- import sys print sys.path #打印環境變量
[[email protected] ~]# python test.py [‘/root‘, ‘/usr/lib64/python27.zip‘, ‘/usr/lib64/python2.7‘, ‘/usr/lib64/python2.7/plat-linux2‘, ‘/usr/lib64/python2.7/lib-tk‘, ‘/usr/lib64/python2.7/lib-old‘, ‘/usr/lib64/python2.7/lib-dynload‘, ‘/usr/lib64/python2.7/site-packages‘, ‘/usr/lib/python2.7/site-packages‘]
2. OS
2.1 os.system
[[email protected] ~]# cat test.py #!/usr/bin/env python # -*- coding: gbk -*- import os result = os.system(‘ifconfig eth0‘) print result
[[email protected] ~]# python test.py # os.system(‘ifconfig eth0‘) eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.130.128 netmask 255.255.255.0 broadcast 192.168.130.255 inet6 fe80::20c:29ff:fec1:295a prefixlen 64 scopeid 0x20<link> ether 00:0c:29:c1:29:5a txqueuelen 1000 (Ethernet) RX packets 180648 bytes 20405707 (19.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 29076 bytes 2468508 (2.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # print result 0
2.2 os.popen
#!/usr/bin/env python # -*- coding: gbk -*- import os result = os.popen(‘ifconfig eth0‘).read() print result
[[email protected] ~]# python test.py # print result eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.130.128 netmask 255.255.255.0 broadcast 192.168.130.255 inet6 fe80::20c:29ff:fec1:295a prefixlen 64 scopeid 0x20<link> ether 00:0c:29:c1:29:5a txqueuelen 1000 (Ethernet) RX packets 181087 bytes 20441778 (19.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 29291 bytes 2531300 (2.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3. 把參數當作命令執行
[[email protected] ~]# cat test.py #!/usr/bin/env python # -*- coding: gbk -*- import os,sys os.system(‘ ‘.join(sys.argv[1:]))
[[email protected] ~]# python test.py ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.130.128 netmask 255.255.255.0 broadcast 192.168.130.255 inet6 fe80::20c:29ff:fec1:295a prefixlen 64 scopeid 0x20<link> ether 00:0c:29:c1:29:5a txqueuelen 1000 (Ethernet) RX packets 181757 bytes 20497644 (19.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 29679 bytes 2669636 (2.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4. 自己的模塊
[[email protected] ~]# cat test.py #!/usr/bin/env python print ‘Hello World!‘
[[email protected] ~]# cat test2.py #!/usr/bin/env python import test
[[email protected] ~]# python test2.py Hello World!
註:test.py 必須放在環境變量的目錄裏,可使用print sys.path 查詢,一般放在當前目錄或者放在E:\Python36\Lib\site-packages 目錄下
七. 認識.pyc
1. Python是一門解釋型語言?
我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。如果是解釋型語言,那麽生成的*.pyc文件是什麽呢?c應該是compiled的縮寫才對啊!
為了防止其他學習Python的人也被這句話誤解,那麽我們就在文中來澄清下這個問題,並且把一些基礎概念給理清。
2. 解釋型語言和編譯型語言
計算機是不能夠識別高級語言的,所以當我們運行一個高級語言程序的時候,就需要一個“翻譯機”來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分成兩類,第一種是編譯,第二種是解釋。
編譯型語言在程序執行之前,先會通過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。
解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然後直接運行,最典型的例子是Ruby。
通過以上的例子,我們可以來總結一下解釋型語言和編譯型語言的優缺點,因為編譯型語言在程序運行之前就已經對程序做出了“翻譯”,所以在運行時就少掉了“翻譯”的過程,所以效率比較高。但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優化來在對程序做出翻譯時對整個程序做出優化,從而在效率上超過編譯型語言。
此外,隨著Java等基於虛擬機的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種。
用Java來舉例,Java首先是通過編譯器編譯成字節碼文件,然後在運行時通過解釋器給解釋成機器文件。所以我們說Java是一種先編譯後解釋的語言。
3. Python到底是什麽
其實Python和Java/C#一樣,也是一門基於虛擬機的語言,我們先來從表面上簡單地了解一下Python程序的運行過程吧。
當我們在命令行中輸入python hello.py時,其實是激活了Python的“解釋器”,告訴“解釋器”:你要開始工作了。可是在“解釋”之前,其實執行的第一項工作和Java一樣,是編譯。
熟悉Java的同學可以想一下我們在命令行中如何執行一個Java的程序:
javac hello.java
java hello
只是我們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也一樣,當我們執行python hello.py時,他也一樣執行了這麽一個過程,所以我們應該這樣來描述Python,Python是一門先編譯後解釋的語言。
4. 簡述Python的運行過程
在說這個問題之前,我們先來說兩個概念,PyCodeObject和pyc文件。
我們在硬盤上看到的pyc自然不必多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。我們先簡單知道就可以了,繼續向下看。
當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,如果找到,則直接載入,否則就重復上面的過程。
所以我們應該這樣來定位PyCodeObject和pyc文件,我們說pyc文件其實是PyCodeObject的一種持久化保存方式。
八. 數據類型
1、數字
int(整型)
在32位機器上,整數的位數為32位,取值範圍為-2**31~2**31-1,即-2147483648~2147483647
在64位系統上,整數的位數為64位,取值範圍為-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(長整型)
跟C語言不同,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,但實際上由於機器內存有限,我們使用的長整數數值不可能無限大。
註意,自從Python2.2起,如果整數發生溢出,Python會自動將整數數據轉換為長整數,所以如今在長整數數據後面不加字母L也不會導致嚴重後果了。pyhton 3X沒有長整型
float(浮點型)
先掃盲 http://www.cnblogs.com/alex3714/articles/5895848.html
浮點數用來處理實數,即帶有小數的數字。類似於C語言中的double類型,占8個字節(64位),其中52位表示底,11位表示指數,剩下的一位表示符號。
complex(復數)
復數由實數部分和虛數部分組成,一般形式為x+yj,其中的x是復數的實數部分,y是復數的虛數部分,這裏的x和y都是實數。
註:Python中存在小數字池:-5 ~ 257
2、布爾值
真或假
1 或 0
3、字符串
3.1 字符串格式化輸出
>>> "I am %s, %d year old, I love %s" % (‘Sam‘,12, ‘dog‘) ‘I am Sam, 12 year old, I love dog‘
>>> "I am {}, {} year old, I love {}".format(‘Sam‘,12, ‘dog‘) ‘I am Sam, 12 year old, I love dog‘
>>> "I am {2}, {0} year old, I love {1}".format(12,‘dog‘, ‘Sam‘) ‘I am Sam, 12 year old, I love dog‘
>>> "I am {name}, {age} year old, I love {dong}".format(name=‘Sam‘,age=12, dong=‘dog‘) ‘I am Sam, 12 year old, I love dog‘
註:%s字符串,%d整型,%f浮點數
3.2 字符串方法
1--> 移除空白
str = ‘ ggggggggggg \n‘ print(str) print(str.strip()) print(str.lstrip()) print(str.rstrip()) print(‘````````````‘)
結果
ggggggggggg ggggggggggg ggggggggggg ggggggggggg ````````````
2--> 分割
print(‘i am a boy, are you ok?‘.split(‘a‘))
結果
[‘i ‘, ‘m ‘, ‘ boy, ‘, ‘re you ok?‘]
3--> 長度
str = ‘i am a boy, are you ok?‘ print(len(str))
結果
23
4--> 索引
>>> ‘i am a boy, are you ok?‘.index(‘you‘) 16 >>> ‘i am a boy, are you ok?‘.index(‘a‘) 2
5--> 切片
>>> str=‘i am a boy, are you ok?‘ >>> str[5] ‘a‘ >>> str[5:] ‘a boy, are you ok?‘ >>> str[-3:] ‘ok?‘ >>> str[-3:-6] ‘‘ >>> str[-3:-6:-1] ‘o u‘ >>> str[-3:-8:-1] ‘o uoy‘
6 --> 替代
>>> str.replace(‘a‘,‘B‘) ‘i Bm B boy, Bre you ok?‘
註:還有很多方法,暫不一一總結
4. 列表
4.1 創建列表
>>> name = [‘gao‘, ‘sam‘, ‘snow‘, ‘jey‘] >>> type(name) <type ‘list‘> >>> name=list([‘gao‘, ‘sam‘, ‘snow‘, ‘jey‘]) >>> type(name) <type ‘list‘> >>> name = [] >>> type(name) <type ‘list‘> >>> name = list() >>> type(name) <type ‘list‘>
4.2 列表方法(大部分方法與字符串一樣)
1--> 索引
>>> name=list([‘gao‘, ‘sam‘, ‘snow‘, ‘jey‘]) >>> name.index(‘jey‘) 3
2 --> 切片 (與字符串一樣)
3--> 追加
>>> name.append(‘hao‘) >>> name [‘gao‘, ‘sam‘, ‘snow‘, ‘jey‘, ‘hao‘]
4--> 刪除
>>> name [‘gao‘, ‘sam‘, ‘snow‘, ‘jey‘, ‘hao‘] >>> del name[1] >>> name [‘gao‘, ‘snow‘, ‘jey‘, ‘hao‘]
>>> name [‘gao‘, ‘snow‘, ‘jey‘, ‘hao‘] >>> name.remove(‘gao‘) >>> name [‘snow‘, ‘jey‘, ‘hao‘]
5 --> 長度
>>> name [‘snow‘, ‘jey‘, ‘hao‘] >>> len(name) 3
6 --> 循環
>>> for i in name: ... print i ... snow jey hao
註:還有很多方法,暫不一一總結
5. 元組(不可變列表)
>>> name=(‘Sam‘, ‘Jey‘, ‘Snow‘) >>> type(name) <type ‘tuple‘> >>> name=tuple((‘Sam‘, ‘Jey‘, ‘Snow‘)) >>> type(name) <type ‘tuple‘>
6. 字典(無序的)
>>> person = {‘name‘: ‘Sam‘, ‘age‘: 23} >>> type(person) <type ‘dict‘> >>> person = dict({‘name‘: ‘Sam‘, ‘age‘: 23}) >>> type(person) <type ‘dict‘>
九. 數據運算
算數運算:
比較運算:
賦值運算:
邏輯運算:
成員運算:
身份運算:
位運算:
運算符優先級:
十. if if...else if...elif..else
1. if .. else
username = input(‘pls enter your username:‘) password = input(‘pls enter your password:‘) if username == ‘sam‘ and password == ‘123456‘: print(‘now login......‘) else: print(‘invalid username or passwod‘)
2. if ... elif ..else
number = int(input(‘pls enter your number:‘)) if number == 50: print(‘you are right...‘) elif number > 50: print(‘too big‘) else: print(‘too small....‘)
十一. while
1. while True
while True: number = int(input(‘pls enter your number:‘)) if number == 50: print(‘you are right...‘) break elif number > 50: print(‘too big‘) else: print(‘too small....‘)
2. while <表達式>
count = 1 while count > 3: number = int(input(‘pls enter your number:‘)) if number == 50: print(‘you are right...‘) elif number > 50: print(‘too big‘) else: print(‘too small....‘) count += 1
十二. for
for i in range(2,12): print(‘number:‘, i)
結果
number: 2 number: 3 number: 4 number: 5 number: 6 number: 7 number: 8 number: 9 number: 10 number: 11
十二. bytes類型
以下內容取自http://www.cnblogs.com/zanjiahaoge666/p/6402907.html
標題:Python3中內置類型bytes和str用法及byte和string之間各種編碼轉換
python3最重要的新特性大概要算對文本和二進制數據做了更為清晰的區分,文本總是unicode字符集,有str類型表示,二進制數據則有bytes類型表示。python3不會以任何隱式的方式混用str和bytes,正是這是的這兩者的區別特別明顯,你不能拼接字符串和字節包,也無法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數為字節包的函數(反之亦然);
我們不關心字符串在內部是如何被表示的,也不關心它用幾個字節來表示每個字符。只有在將字符串編碼成字節(如用於通信信道的傳輸)或將字節解碼成字符串時,才考慮這些問題。
1. 創建bytes類型數據
>>> a = bytes([1,2,3,4]) >>> a b‘\x01\x02\x03\x04‘ >>> type(a) <class ‘bytes‘> >>> >>> a = bytes(‘hello‘,‘ascii‘) >>> >>> a b‘hello‘ >>> type(a) <class ‘bytes‘>
2. 編碼可以將抽象字符以二進制數據的形式表示,有很多編碼方法,如utf-8、gbk等,可以使用encode()函數對字符串進行編碼,轉換成二進制字節數據,也可用decode()函數將字節解碼成字符串;用decode()函數解碼,可不要用指定編碼格式;
>>> a = ‘hello world‘ >>> type(a) <class ‘str‘> >>> a ‘hello world‘
a. 按utf-8的方式編碼,轉成bytes:以及解碼成字符串
>>> b = a.encode(encoding=‘utf-8‘) >>> type(b) <class ‘bytes‘> >>> >>> b b‘hello world‘ >>> >>> >>> c = b.decode(encoding=‘utf-8‘) >>> type(c) <class ‘str‘> >>> c ‘hello world‘ >>>
b. 按gbk的方式編碼,轉成bytes:以及解碼成字符串
>>> x = a.encode(encoding=‘gbk‘) >>> type(x) <class ‘bytes‘> >>> >>> x b‘hello world‘ >>> >>> y = x.decode() >>> type(y) <class ‘str‘> >>> >>> y ‘hello world‘ >>>
十三. 三元運算
>>> grilF = ‘Snow‘ if 2 > 1 else ‘Jey‘ >>> grilF ‘Snow‘ >>> grilF = ‘Snow‘ if 2 < 1 else ‘Jey‘ >>> grilF ‘Jey‘
python初步——基礎總結(一)