內容簡要:java
1. python簡介
2. Python能作什麼
3. Python性能優化工具
4. Python執行過程
5. Python解釋器/種類
6. Python基本編程風格
7. 變量
8. 內嵌保留字
9. 安裝Python
10. Hello World
11. Print輸出格式
12. Python數據類型
13. 經常使用內置函數
14. 經常使用數學運算
15. 比較運算
16. Python模塊
17. 控制流
python
一. Python簡介linux
Python(發音:/ˈpaɪθɑːn/),是一種面向對象、直譯式的計算機程序語言,具備近二十年的發展歷史。它包含了一組功能完備的標準庫,可以輕鬆完成不少常見的任務。它的語法簡單,與其它大多數程序設計語言使用大括號不同,它使用縮進來定義語句塊。由Guido van Rossum於1989年末發明,第一個公開發行版發行於1991年。官方站點:https://www.python.org/ ios
二. Python能作什麼?git
Python是一門綜合性的語言,幾乎能用python在計算機上作任何事情,下面列舉幾個最普遍的方面:算法
1. 網絡應用:Web站點(Django\Tornado\Flash等框架)、服務器後臺服務(Twisted網絡服務框架 )以及牛13的eventlet異步通訊框架等;shell
2. 科學運算:隨着NumPy、matplotlib、ETS等衆多程序庫的開發,Python愈來愈適合於作科學運算;編程
3. GUI程序:包括PyQt、WxPython,自帶的有Tkinter等;ubuntu
4. 系統管理工具:能夠用python輕鬆的開發一些自動化運維、監控的工具,當下比較流行的諸多開源軟件好多都是用python開發的,如自動話配置工具SaltStack、Ansible,私有云解決方案Openstack等;vim
5. 其餘實現:爬蟲、遊戲後臺等等,總之很牛逼。。。
三. Python的性能優化工具:
Psyco:Python語言的擴展模塊,即時對程序代碼進行算法優化,能夠必定程度上提升程序執行速度,尤爲是程序中有大量循環時,如今已經中止維護;
Shed Skin,Python編譯器,可以將Python代碼轉換成優化的C++代碼;
四. Python 執行過程:
source code --> Complier ---> bytecode --> PVM Interpreter ---> processor
.py .pyc
五. Python解釋器/種類:
CPython,原始、標準官方的實現方式,用C語言開發,
Jython,用於和Java語言集成的實現,把Python代碼直接編譯成java字節碼執行;
IPython,基於CPython之上的一個交互解釋器,交互上很是直觀,可是執行代碼功能和CPython徹底同樣;
IronPython,用於和.NET框架集成的實現,能夠直接把python代碼編譯成.Net的字節碼
PyPy,使用python語言實現的Python解釋器,是動態編譯器,是Psyco的後繼項目;可運行在Linux的3二、64位、MacOSX和Windows的32位平臺上
六. Python的基本編程風格:
註釋,第一行開始
#!/usr/bin/env python
文檔
經過__doc__,能夠查看的幫助信息,如print(id.__doc__),能夠獲取id內嵌函數的幫助信息;
縮進
建議:統一縮進四個空格
標識符名稱
見名知意
$ vim first.py
#!/usr/bin/env python
"This is a test scripts"
print('hello world') print('bye!')
cnfol@ubuntu:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import first
hello world
bye!
>>> print(first.__doc__)
This is a test scripts
七. 變量:
1. 單一下劃線開始的變量名(_x)不會被「from module import *」導入
2. 先後都有下劃線的變量名(__x__)是系統變量,對python解釋器有特殊意義;
如:
__name__ 調用當前模塊的名稱,或者理解爲導入了當前模塊的名稱
__main__ 若是模塊是本身執行的,默認就是__main__
每一個模塊都有一個名爲__name__的內建變量,此變量的值會根據調用此模塊的方式發生變化
若是此文件被做爲模塊導入,則__name__的值爲模塊名稱;
若是此文件被直接執行,則__name__的值爲」__main__「
3. 兩個下劃線開頭,可是結尾沒有下劃線的變量(__x)是類的本地變量;
4. 交互模式下,只有單個下劃線的變量名(_x)用於保存最後表達式的結果;
Python中的內嵌保留字(Python3)
False class finally is return None continue for lambda try True from nonlocal while and del global not with as elif if or yield assert else import pass break except in raise
八. 實例、類、方法:
Python程序中保存的全部數據都是圍繞「對象」展開的:
程序中存儲的全部數據都是對象
每一個對象都有一個身份(id)、一個類型(type)和一個值()
>>> name = 'daniel'
>>> id(name)
23051200
>>> type(name) <class 'str'> >>> name 'daniel'
對象的類型也稱爲對象的類別,用於描述對象的內部表示及它支持的方法和操做;
建立特定類型的對象時,有時也將該對象成爲該類型的實例
實例被建立後,其身份和類型就不可改變
對象值可變,爲可變對象
不可修改,爲不可變對象
若是某個對象包含對其餘對象的引用,則成爲容器,如列表
大多數對象都擁有大量特有的數據屬性和方法
屬性:與對象相關的值,能夠直接獲取,如用print
方法:被調用時將在對象上執行某些操做的函數,調用使用()運算符;
使用點(.)運算符能夠訪問屬性和方法;
訪問屬性:
>>> print num.real
訪問方法:
>>> num.real()
class:自定義類型時使用
type:內置的類型,和class指的是一個意思
instance:實例,任何對象都是有類實例化而來的
每一種對象都是由其類生成的。
類,由數據和操做這片數據的函數組成,對類中的這片函數稱爲方法;
用類實例出一個對象時,類自己只是描述了一種抽象屬性,只有把這種抽象屬性實例出來才叫作對象;
對象自己只包含了數據,方法是屬於類的;
在python中一切皆對象,對象其實就是"類"實例化而來的,有的是內置類,用戶也能夠自定義類;
九. 安裝Python:
*nix平臺上系統自帶python,windows平臺直接去Python官網https://www.python.org/ 下載相對應平臺的版本,而後按照安裝嚮導完成安裝便可,此處選擇Python3.5.1,安裝過程略...
IDE:
推薦使用Pycharm,能夠從官方站點下載對應的版本安裝便可,Pycharm有社區版(免費)和專業版,官方站點:https://www.jetbrains.com/pycharm/
十. Hello World:
>python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print('hello world') hello world >>>
在Linux平臺下(Python3.5)建立一個Python腳本:
1. $ vim first.py # python腳本以.py結尾,不是必須,可是理應遵循的一個命令規範,看文件後綴就能知道是個Python程序
2. 輸入代碼:
#!/usr/bin/env python
print('hello world')
第一行#!/usr/bin/env python,聲明腳本調用的解釋器類型;print打印,相似於shell中的echo
3. 執行:
$ python first.py
執行能夠用上述直接調用python解釋器執行,也能夠給腳本賦予執行權限,然後. first.py,注意,第二種方式在腳本首行務必添加聲明腳本執行解釋器行。
十一. Print輸出格式:
print "String %format1 %format2..." %(variable1,variable2,...)
d,i 十進制整數或長整數
u 無符號整數或長整數
o 八進制整數或長整數
x 十六進制整數或長整數
X 十六進制整數(大寫字母)
f 浮點數,如[-]m.dddddd
e 浮點數,如[-]m.dddddde+xx
E 浮點數,如[-]m.ddddddE+xx
g,G 指數小於-4或更高精度時使用%e或者%E,不然使用%f
s 字符串或者任意對象。格式化代碼使用str()生成字符串
r 同repr()生成的字符串
c 單個字符
% 字面量%,就是顯示自身
十二. Python的數據類型:
內置(核心)數據類型
數字:int, long, float, complex(負數), bool
字符:str, unicode
列表:List
字典:dict
元組:tuple
文件:file
其餘:集合(set)、凍結集合(frozenset), 類類型, None( 空)
十三. Python經常使用的內置函數:
id(),查看對象指向內存指>>> name = 'daniel'
>>> name = 'daniel' >>> id(name) 4324613008
type(),獲取對象類型
>>> type(name) <class 'str'>
len() 獲取對象長度
>>> len(name)
6
input(),獲取用戶鍵盤輸入
>>> name = input('Please your name:') Please your name:Daniel >>> name 'Daniel'
Python3.x裏的input捕獲到用戶輸入數據爲str類型,若是須要用戶輸入int類型,須要加int()來轉換以下:
>>> age = input('Age?') Age?18 >>> type(age) <class 'str'> >>> age1 = int(input('Age?')) Age?19 >>> type(age1) <class 'int'>
raw_input() 獲取用戶鍵盤輸入,這個是python2中的語法,python3中已經廢棄;
二者的區別是input捕獲到用戶的鍵盤輸入不作更改,用戶輸入類型是什麼,就是什麼類型,而raw_input,會默認爲str類型;
dir(__builtins__),顯示系統內嵌模塊
>>> name = 'daniel' >>> dir(name) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
help(),顯示內嵌模塊幫助,如顯示str用法,help(str)
>>> help(str)
退出請按q
callable() 查看對象是否能夠調用,能夠調用爲真,不然爲假
>>> name = 'Daniel' >>> callable(name) False >>> def name1(): ... print(name) ... >>> >>> callable(name1) True
十四. Python數學運算:
>>>print 1+9 # 加法
>>>print 1.3-4 # 減法
>>>print 3*5 # 乘法
>>>print 4.5/1.5 # 除法
>>>print 3**2 # 乘方
>>>print 10%3 # 求餘數,取模
x // y, 截斷除法,只取第一段整數結果
-x, 一元減法
+x, 一元加法
十五. Python比較運算:
x << y 左移,如,58<<1, 左移動一位就是乘以2,兩位就是乘以4...
二進制表示: 128 64 32 16 8 4 2 1 58 0 0 1 1 1 0 1 0 <<1 0 1 1 1 0 1 0 0 = 116 >>> 58 << 1 116 >>> 58 << 2 232
x >> y 右移,其實右移動一位就是除以2取整,右移動2爲就是除以4取整...;
二進制表示: 128 64 32 16 8 4 2 1 58 0 0 1 1 1 0 1 0 >>1 0 0 0 1 1 1 0 1 = 29
>>> 58 >> 1
29
>>> 58 >> 2
14
x & 7 按位與,二進制中的兩個數,二進制都爲1時,結果爲1,不然爲0;
二進制表示: 128 64 32 16 8 4 2 1 58 0 0 1 1 1 0 1 0 25 0 0 0 1 1 0 0 1 & 0 0 0 1 1 0 0 0 = 24
>>> 58 & 25
24
x | y 按位或,二進制中的兩個數,二級制有1時,結果都爲1,不然爲0;
二進制表示:
58 0 0 1 1 1 0 1 0 25 0 0 0 1 1 0 0 1 | 0 0 1 1 1 0 1 1 = 59
>>> 58|25
59
x ^ y 按位異或,二進制中的兩個數,二進位相異時,相同爲0,不一樣爲1;
二進制表示:
58 0 0 1 1 1 0 1 0 25 0 0 0 1 1 0 0 1 ^ 0 0 1 0 0 0 1 1 = 35
>>> 58^25
35
~x 按位求反,-(x+1),正變負,負變正;
>>> ~58
-59
>>> ~-1
0
>>> ~-11
10
>>> ~10
-11
十六. Python模塊
牛X的python有着很是強大標準庫和異常牛逼的第三方庫,能幫助開發者完成各類需求。先列兩個簡單的:
1. OS模塊
是Python標準庫中用於訪問操做系統功能的模塊。
首先導入模塊:
>>> import os
查看幫助信息:
>>> help(os)
列出模塊經常使用的方法:
>>> dir(os) ['CLD_CONTINUED', 'CLD_DUMPED', 'CLD_EXITED', 'CLD_TRAPPED', 'EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER', 'EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_LOCK', 'F_OK', 'F_TEST', 'F_TLOCK', 'F_ULOCK', 'MutableMapping', 'NGROUPS_MAX', 'O_ACCMODE', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_EXLOCK', 'O_NDELAY', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_SHLOCK', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'PRIO_PGRP', 'PRIO_PROCESS', 'PRIO_USER', 'P_ALL', 'P_NOWAIT', 'P_NOWAITO', 'P_PGID', 'P_PID', 'P_WAIT', 'RTLD_GLOBAL', 'RTLD_LAZY', 'RTLD_LOCAL', 'RTLD_NODELETE', 'RTLD_NOLOAD', 'RTLD_NOW', 'R_OK', 'SCHED_FIFO', 'SCHED_OTHER', 'SCHED_RR', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'ST_NOSUID', 'ST_RDONLY', 'TMP_MAX', 'WCONTINUED', 'WCOREDUMP', 'WEXITED', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WNOWAIT', 'WSTOPPED', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_get_exports_list', '_putenv', '_spawnvef', '_unsetenv', '_wrap_close', 'abort', 'access', 'altsep', 'chdir', 'chflags', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'cpu_count', 'ctermid', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'environb', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fsdecode', 'fsencode', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'get_blocking', 'get_exec_path', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getegid', 'getenv', 'getenvb', 'geteuid', 'getgid', 'getgrouplist', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getpriority', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchflags', 'lchmod', 'lchown', 'linesep', 'link', 'listdir', 'lockf', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'popen', 'pread', 'putenv', 'pwrite', 'read', 'readlink', 'readv', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sched_get_priority_max', 'sched_get_priority_min', 'sched_yield', 'sendfile', 'sep', 'set_blocking', 'set_inheritable', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setpriority', 'setregid', 'setreuid', 'setsid', 'setuid', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'st', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sync', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'terminal_size', 'times', 'times_result', 'truncate', 'ttyname', 'umask', 'uname', 'uname_result', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'walk', 'write', 'writev']
經常使用方法:
system,調用本地系統命令
如查看系統磁盤使用量: >>> os.system('df -Th') Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_template-lv_root ext4 45G 17G 27G 39% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/vda1 ext4 485M 33M 427M 8% /boot 172.16.30.251:/data/Deployment nfs 14T 12T 1.8T 87% /mnt
popen,保存命令執行結果,而不是執行結果返回的狀態值
>>> a = os.popen('df -h') >>> print(a.read()) Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1 233Gi 148Gi 84Gi 64% 38899509 22081737 64% / devfs 185Ki 185Ki 0Bi 100% 639 0 100% /dev map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home
2. getpass模塊
Python標準庫,秉承*nix輸入密碼風格不顯示輸入信息的風格
>>> import getpass >>> dir(getpass) ['GetPassWarning', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_raw_input', 'contextlib', 'fallback_getpass', 'getpass', 'getuser', 'io', 'os', 'sys', 'termios', 'unix_getpass', 'warnings', 'win_getpass'] 獲取當前用戶 >>> getpass.getuser() 'daniel' 獲取用戶輸入的密碼信息 >>> password=getpass.getpass() Password: >>> print(password) Woyebuzhidaomimashisha
十七. 控制流
1. if..else
需求:判斷用戶輸入的用戶名和密碼是否正確,如正確就打印歡迎登錄,錯誤提示用戶名或密碼錯誤,結合getpass模塊:
#!/usr/bin/env python # -*- coding: utf-8 -*- import getpass user = 'daniel' password = 'nicai' input_user = input('Username?') input_pass = getpass.getpass('Password?') if input_user == user and input_pass == password: print('歡迎登錄,%s' %input_user) else: print('用戶名或者密碼錯誤,請稍後再試')
2. while
循環,知足條件進入循環:
仍是上面的需求,容許用戶輸入嘗試三次,若是連續三次失敗的話,退出程序,使用while循環來處理:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import getpass user = 'daniel' password = 'nicai' Count = 0 #定義一個標誌位 while True: if Count < 3: input_user = input('Username?') input_pass = getpass.getpass('Password?') if input_user == user and input_pass == password: print('歡迎登錄,%s' %input_user) break #成功後直接跳出循環 else: print('用戶名或密碼輸入錯誤,請重試!') else: Continue_flag = input('輸入錯誤次數過多,是否繼續?y/n') if Continue_flag == 'y': Count = 0 continue else: break Count += 1
3. for..in
繼續完善上面的需求,容許用戶輸入嘗試三次,若是連續三次失敗的話,退出程序:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import getpass user = 'daniel' password = 'nicai' Count = 0 #定義一個標誌位 for i in range(10): if Count < 3: input_user = input('Username?') input_pass = getpass.getpass('Password?') if input_user == user and input_pass == password: print('歡迎登錄,%s' %input_user) break #成功後直接跳出循環 else: print('用戶名或密碼輸入錯誤,請重試!') else: Continue_flag = input('輸入錯誤次數過多,是否繼續?y/n') if Continue_flag == 'y': Count = 0 continue else: break Count += 1