腳本文件:javascript
腳本文件英文爲Script。實際上腳本就是程序,通常都是由應用程序提供的編程語言。應用程序包括瀏覽器(javaScript、VBScript)、多媒體創做工具,應用程序的宏和創做系統的批處理語言也能夠納入腳本之類。
腳本文件相似於DOS操做系統中的批處理文件,它能夠將不一樣的命令組合起來,並按肯定的順序自動連續地執行。腳本文件是文本文件,用戶可以使用任一文本編輯器來建立腳本文件。css
解釋器:html
解釋器(英語:Interpreter),又譯爲直譯器,是一種電腦程序,可以把高級編程語言一行一行直接轉譯運行。解釋器不會一次把整個程序轉譯出來,只像一位「中間人」,每次運行程序時都要先轉成另外一種語言再做運行,所以解釋器的程序運行速度比較緩慢。它每轉譯一行程序敘述就馬上運行,而後再轉譯下一行,再運行,如此不停地進行下去。java
python是一個腳本語言,能夠在python解釋器中直接寫代碼或者將代碼寫到一個文件(腳本文件)而後執行這個文件。python
能夠用兩種方式使用python語言:web
- 代碼中的前兩個字符`#!`稱爲shebang告訴shell使用python解釋器執行下面的代碼,同時須要爲腳本文件添加可執行權限,最後執行文件便可。
模塊包含了能夠複用的代碼文件,包含了不一樣的函數定義,變量。模塊文件一般以.py爲擴展名,使用以前先須要導入它。redis
python不須要爲變量指定數據類型,能夠直接寫出abc = 1
同時python的字符串用單引號或雙引號括起來便可。shell
input()
函數能夠實現從鍵盤讀取輸入。express
實現了從鍵盤讀取一個數字而且檢查這個數字是否小於100,運行結果以下圖所示編程
計算投資:
在看代碼時不太能看懂輸出語句的格式,對比執行後的結果
print("Year {} Rs. {:.2f}".format(year, value)) Year 1 Rs. 11400.00
能夠看到,大括號和其中的字符會被替換成傳入.format()
中的變量的值,其中{:.2f}
表示替換爲2位精度的浮點數。
看不懂的地方涉及到函數str.format()是一個強大的格式化函數
經過位置
In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kzc',18) Out[2]: 'kzc,18' In [3]: '{1},{0},{1}'.format('kzc',18) Out[3]: '18,kzc,18'
經過關鍵字參數:即大括號中包含對應的參數名
經過對象屬性
class Person: def __init__(self,name,age): self.name,self.age = name,age def __str__(self): return 'This guy is {self.name},is {self.age} old'.format(self=self) In [2]: str(Person('kzc',18)) Out[2]: 'This guy is kzc,is 18 old'
括號中的參數{:5d} {:7.2f}
分別表示,替換爲5個字節寬度的整數;替換爲7個字節寬度並顯示小數點後兩位的浮點數。
元組(truple)利用逗號建立元組,例如a , b = b, a
在賦值語句的右邊咱們建立了一個元組,稱爲元組封裝;賦值語句左邊則是元組拆封。
>>> data = ("shiyanlou", "China", "Python") >>> name, country, language = data
也就是說,data,(name, country, language)
是兩個封裝,而第二條語句對data進行了拆封。
---
+
-
/
只要有一個操做符是浮點數,結果就會是浮點數。使用//
將會返回商的整數部分。%
求餘運算符計算月份和天數
divmod()函數
python divmod() 函數把除數和餘數運算結果結合起來,返回一個包含商和餘數的元組(a // b, a % b)。
邏輯運算符的優先級又低於關係運算符,在它們之中,not 具備最高的優先級,or 優先級最低,因此 A and not B or C 等於 (A and (notB)) or C
2 > 1 and not 3 > 5 or 4
這條語句能夠看做是((2 > 1) and (not (3 > 5))) or 4
其中 2 > 1
爲真 (not (3 > 5))
也爲真,故返回 True
#!/usr/bin/env python3 sum = 0 for i in range(1, 11): sum += 1.0 / i print("{:2d} {:6.4f}".format(i , sum))
所涉及函數
python range()函數用法
range(start, stop[, step]) 參數說明: start: 計數從 start 開始。默認是從 0 開始。例如range(5)等價於range(0, 5); stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5 step:步長,默認爲1。例如:range(0, 5) 等價於 range(0, 5, 1)
因此在上面代碼中的for循環,即i從1開始,到10結束,其中不包含11;每循環一次進行一次運算,同時打印i和sum的值。
#!/usr/bin/env python3 import math a = int(input("Enter value of a: ")) b = int(input("Enter value of b: ")) c = int(input("Enter value of c: ")) d = b * b - 4 * a * c if d < 0: print("ROOTS are imaginary") else: root1 = (-b + math.sqrt(d)) / (2 * a) root2 = (-b - math.sqrt(d)) / (2 * a) print("Root 1 = ", root1) print("Root 2 = ", root2)
以上是一個求解二次方程的代碼。
#!/usr/bin/env python3 basic_salary = 1500 bonus_rate = 200 commission_rate = 0.02 numberofcamera = int(input("Enter the number of inputs sold: ")) price = float(input("Enter the price of camera: ")) bonus = (bonus_rate * numberofcamera) commission = (commission_rate * price * numberofcamera) print("Bonus= {:6.2f}".format(bonus)) print("Commission = {:6.2f}".format(commission)) print("Gross salary = {:6.2f}".format(basic_salary + bonus + commission))
運行結果以下:
math模塊調用的方法
語法格式:
if expression:
do this
else:
do this
或
if expression:
do this
elif experssion:
do this
else:
do this
注意if後面表達式的:不能少
if後面的表達式爲真將執行縮進的全部行,要保證縮進的正確
語法格式
while condition:
statement1
statement2
要執行的語句必須以正確的縮進放在while語句下面,在表達式condition爲真時執行
#!/usr/bin/env python3 a, b = 0, 1 while b < 100: print(b, end=' ') a, b = b, a + b print()
對於語句a, b = b, a + b
能夠理解爲Python會先對複製右邊的表達式求值而後將值賦給左邊的變量。即將b的值賦給a,a+b的值賦給b。
print()函數除了打印默認字符外,還會打印一個換行符,因此每次調用print()就會換一次行,利用end參數來替換換行符,如上代碼中print(b, end=' ')
#!/usr/bin/env python3 x = float(input("Enter the value of x: ")) n = term = num = 1 result = 1.0 while n <= 100: term *= x / n result += term n += 1 if term < 0.0001: break print("No of Times= {} and Sum= {}".format(n, result))
#!/usr/bin/env python3 i = 1 print("-" * 50) while i < 11: n = 1 while n <= 10: print("{:5d}".format(i * n), end=' ') n += 1 print() i += 1 print("-" * 50)
以上代碼是嵌套循環的代碼,從其運行結果能夠看出print("-" * 50)
的做用
列表中的元素沒必要是同一類型,中間用逗號分隔。
a[256,1,23,'china','love']
其中每一位都有對應的下標,從0開始,能夠利用a[4]對應‘love’使用負數索引,就會從尾部開始計數。
切片不會改變正在操做的列表,切片操做會返回其子列表,即一個新的列表副本。 例如: a[1:-2] 表示 [1,23] a[:-2]則表示[256,1,23]
Python 中有關下標的集合都知足左閉右開原則,切片中也是如此,也就是說集合左邊界值能取到,右邊界值不能取到。
切片長度就是兩個索引之差
[-1:-5]能夠取到所有元素,但[-5:-1]取不到列表中的最後一個值。
切片的上邊界大於下邊界時,返回空列表;一個過大的索引值將被列表的實際長度所代替
能夠檢驗某個值是否在列表中'cool' ia a
內建函數len()能夠得到列表長度
列表容許嵌套
range()函數能夠在for循環須要一個數值序列時使用,具體用法前面提到過。
在循環後面選擇else語句,它將會在循環執行完畢後執行
Python有許多內建的數據結構
其中包括列表、元組、
列表a的創建:a = [23, 45, 1, -3434, 43624356, 234]
向列表添末尾加元素:a.append(45)
添加元素 45 到列表末尾。
向列表任何位置添加元素:a.insert()方法
a.insert(0,1)
在列表0的位置添加元素1列表計算指定值方法:count(s)會返回列表元素中s的數量
移除任意指定值:remove(s)將會移除在列表中的s值
刪除指定位置的值:del()
翻轉列表:reverse()
列表排序:sort()前提是列表的元素是可比較的
pop(i)方法會將第i個元素出棧,例如a.pop(0)將第一個元素彈出列表
squares = [x**2 for x in range(10)]
該語句組成的序列是[0,1,4,9,16,25,36,47,64,81]
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
元組是由數個逗號分隔的值所組成,能夠對任何一個元組執行拆封操做並賦值給多個變量。
元組是不可變類型,元組內沒法進行添加或刪除任何值得操做。
a = 321,
至關於(321,)內建函數type()能夠知道任意變量的數據類型;len()能夠查詢任意序列類型數據長度
集合是一個無序不重複元素的集。基本功能有關係測試和消除重複元素。集合同時還支持數學運算。
大括號或set()函數能夠用來建立集合。
a = set('abracadabra')
獲得的a集合是去重後的字母
字典是無序鍵值對的集合,同一個字典內的鍵必須是互不相同的。鍵與值之間利用:分隔。用鍵來檢索存儲在字典中的值。
data {'kushal': 'Fedora', 'Jace': 'Mac', 'kart_': 'Debian'} 查找字典中鍵對應的值 data['kart_'] 'Debian' 刪除字典中任意指定的鍵值對 del data['kushal'] 查詢指定關鍵字是否在字典中 'ShiYanLou' in data 遍歷字典 items()方法 for x,y in data.items(): print("{} uses {}".format(x,y)) 向字典中元素屢次添加數據 dict.setdefault(key, default) 索引鍵,若是不存在將返回指定的default值 dict.get(key, default) 在便利列表的同時得到元素的索引值,使用enumerate() for i, j in enumerate(['a', 'b', 'c']): 此時,列表的索引值將會存放在變量i中
字典中的鍵必須是不可變類型,好比列表就不能做爲鍵。
運行結果
代碼分析
創建的data字典以學生的姓名做爲鍵,對應的列表中包含的三門成績做爲對應學生的成績,也就是字典的值。data[name] = marks
就是一個建立字典的過程,將對應的列表做爲值與姓名造成鍵值對。3
當輸入幾行字符串而且但願行尾換行符自動包含到字符串中,使用三對引號"""....."""
或'''....'''
s.split() 分隔字符串
語法方法:
str.split(str="", num=string.count(str)).
參數
str -- 分隔符,默認爲全部的空字符,包括空格、換行(\n)、製表符(\t)等。
num -- 分割次數。默認爲 -1, 即分隔全部。
返回值
返回分割後的字符串列表。
title()返回字符串的標題版本,即單詞首字母大寫其他字母小寫
upper() 返回字符串的所有大寫版本
lower()返回字符串的所有小寫版本
swapcase() 返回字符串大小寫交換後的版本
isalnum() 檢查全部字符是否只包含數字和字母
isal
-pha() 檢查字符串是否只有字母
join() 使用指定字符鏈接多個字符串
"-".join("GNU/Linux is great".split())
'GNU/Linux-is-great'
lstrip(chars)或rstrip(chars) 對字符串左或右剝離
find()能夠找到字符串中第一個匹配的字符串
將字符串倒序的方式 z = s[::-1]
這是前面提到的切片的方法,能夠對列表、元組等使用。
假如 a = (1,2,3,4,5) 那麼 a[:] a[::] 都表明(1,2,3,4,5)使用默認值a[0:len(a):1] 前面提到過a[0:2]表示a(1,2) 在本題中a[::-1]表示步長爲負數,從序列的最後一個元素開始切片,即倒序
使用關鍵字def定義函數
def 函數名(參數): 語句1 語句2
將回文判斷寫成一個函數
#!/usr/bin/env python3 def palindrome(s): return s == s[::-1] if __name__ == '__main__': s = input("Enter a string: ") if palindrome(s): print("Yay a palindrome") else: print("Oh no, not a palindrome")
在這裏很疑惑 name == 'main' 的做用是什麼,參考一篇博客,明白__name__是函數的內置變量,詳細參考博客https://blog.csdn.net/xyisv/article/details/78069129
在函數中建立的變量是局域變量,只在函數中可用,函數完成時銷燬。一樣在函數中,變量出如今表達式等號以前,就會被當作局部變量。
使用global關鍵字,對函數中的a標誌爲全局變量,讓函數內部使用全局變量a,那麼整個程序中出現a都將是同樣的。
函數參數變量能夠有默認值,若是對指定的參數變量沒有給出任何值,則會賦其任意值。
def test(a , b=-99):
if a > b:
return True
else:
return False
須要注意的是:
- 具備默認值的參數後面不能再有普通參數
高階函數或仿函數是能夠接受函數做爲參數的函數
它接受一個函數和一個序列(迭代器)做爲輸入,而後對序列(迭代器)的每個值應用這個函數,返回一個序列(迭代器),其包含應用函數後的結果。
lst = [1, 2, 3, 4, 5] return num * num print(list(map(square, lst))) [1, 4, 9, 16, 25]
使用open()函數打開文件,須要兩個參數,第一個是文件路徑或文件名;第二是文件的打開方式
使用close()關閉文件
read()方法一次性讀取整個文件。
read()有一個可選參數size用來返回指定字符串長度,若是沒有指定size或size爲負數,會讀取整個文件
write()方法打開文件而後隨便寫入一些文本
#!/usr/bin/env python3 import sys if len(sys.argv) < 3: print("Wrong parameter") print("./copyfile.py file1 file2") sys.exit(1) f1 = open(sys.argv[1]) s = f1.read() f1.close() f2 = open(sys.argv[2], 'w') f2.write(s) f2.close()
用到了sys模塊的sys.argv函數,一開始不明的到底這個函數的功能是什麼,參考了一篇博客,瞭解到sys.argv實際上是外部命令與程序內部的橋樑,是一個列表,因此能夠經過argv[]進行調用。
http://www.javashuo.com/article/p-cthlxfyn-n.html
運行結果如圖所示:
在程序執行過程當中發生的任何錯誤都是異常。每一個異常顯示一些相關的錯誤信息。
NameError訪問一個未定義變量時會發生NameError異常
TypeError當操做或函數應用於不適當類型的對象時引起
使用try...except
快處理異常。
首先,執行 try 子句 (在 try 和 except 關鍵字之間的部分)。
若是沒有異常發生,except 子句 在 try 語句執行完畢後就被忽略了。
若是在 try 子句執行過程當中發生了異常,那麼該子句其他的部分就會被忽略。
若是異常匹配於 except 關鍵字後面指定的異常類型,就執行對應的 except 子句。而後繼續執行 try 語句以後的代碼。
若是發生了一個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中。
若是最終仍找不到對應的處理語句,它就成爲一個 未處理異常,終止程序運行,顯示提示信息。
一個空的except()語句能夠捕獲任何異常。
使用raise()語句拋出異常
try語句還有另外一個可選的finally字句,在於定義任何狀況下都必定要執行的功能。
無論有沒有發生異常,finally 子句 在程序離開 try 後都必定會被執行。當 try 語句中發生了未被 except 捕獲的異常(或者它發生在 except 或 else 子句中),在 finally 子句執行完後它會被從新拋出。
class nameoftheclass(parent_class): statement1 statement2 statement3
x = MyClass()
以上類的實例用於建立一個空對象,建立一個有初始狀態的類,須要用到方法 init()進行初始化。
當一個類繼承另外一個類時,它將繼承父類的全部功能(如變量和方法)。這有助於重用代碼。
繼承方式:
class Person(object):
def init(self,name):
def get_details(self):
class Student(Person):
class Teacher(Person):
有了init方法後,在建立類的對象時,不須要調用init方法,直接調用類的初始化方法便可。
person1 = Person('Sachin') student1 = Student('Kushal', 'CSE', 2005) teacher1 = Teacher('Prashad', ['C', 'C++'])
del s
來刪除對象
你可能想要更精確的調整控制屬性訪問權限,你可使用 @property 裝飾器,@property 裝飾器就是負責把一個方法變成屬性調用的。
模塊是包括 Python 定義和聲明的文件。文件名就是模塊名加上 .py 後綴。__name__全局變量能夠獲得模塊的模塊名。
模塊內的函數必需要用模塊名來訪問。
bars.hashbar(10)
bars.simplebar(10) bars.starbar(10)
含有__init__.py文件的目錄能夠用來做爲一個包,其中目錄裏的全部.py文件都是這個包的子模塊
若是 init.py 文件內有一個名爲 all 的列表,那麼只有在列表內列出的名字將會被公開。
sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install requests
從指定URL下載文件的程序
#!/usr/bin/env python3 import requests def download(url): # 檢查 URL 是否存在 try: req = requests.get(url) except requests.exceptions.MissingSchema: print('Invalid URL "{}"'.format(url)) return # 檢查是否成功訪問了該網站 if req.status_code == 403: print('You do not have the authority to access this page.') return filename = url.split('/')[-1] with open(filename, 'w') as fobj: fobj.write(req.content.decode('utf-8')) print("Download over.") if __name__ == '__main__': url = input('Enter a URL: ') download(url)
counter是一個有助於hashable對象計數的dict子類。它是一個無序的集合,其中 hashable 對象的元素存儲爲字典的鍵,它們的計數存儲爲字典的值,計數能夠爲任意整數,包括零和負數。
defaultdict() 第一個參數提供了 default_factory 屬性的初始值,默認值爲 None,default_factory 屬性值將做爲字典的默認數據類型。全部剩餘的參數與字典的構造方法相同,包括關鍵字參數。
命名元組有助於對元組每一個位置賦予意義,而且讓咱們的代碼有更好的可讀性和自文檔性。你能夠在任何使用元組地方使用命名元組。在例子中咱們會建立一個命名元組以展現爲元組每一個位置保存信息。
_iter__(),返回迭代器對象自身。這用在 for 和 in 語句中。
next(),返回迭代器的下一個值。若是沒有下一個值能夠返回,那麼應該拋出 StopIteration 異常。
生成器是更簡單的建立迭代器的方法,這經過在函數中使用 yield 關鍵字完成。
def counter_generator(low, high): while low <= high: yield low low += 1 for i in counter_generator(5,10): print(i, end=' ') 5 6 7 8 9 10
在 While 循環中,每當執行到 yield 語句時,返回變量 low 的值而且生成器狀態轉爲掛起。在下一次調用生成器時,生成器從以前凍結的地方恢復執行而後變量 low 的值增一。也就是說,在下一次執行生成器前,low的值不會改變。
安裝兩個不用的虛擬環境,並激活source virt1/bin/activate
安裝redis
這個Python模塊
安裝另外一個虛擬環境,並安裝不一樣版本的redis
以知足不一樣的編程須要
在 Python 裏咱們有 unittest 這個模塊來幫助咱們進行單元測試。
首先導入了 unittest 模塊,而後測試咱們須要測試的函數。
測試用例是經過子類化 unittest.TestCase 建立的。
測試覆蓋率是找到代碼庫未經測試的部分的簡單方法。它並不會告訴你的測試好很差。
假設實驗項目名爲factorial建立/home/shiyanlou/factorial
,將要建立的Python模塊取名爲myfact,建立目錄/home/shiyanlou/factorial/myfact
。主代碼放在fact.py文件中,模塊的__init.py__文件,將設定目錄顯示的文件。
/home/shiyanlou/factorial/MANIFEST.in
文件,它用來在使用 sdist 命令的時候找出將成爲項目源代碼壓縮包一部分的全部文件。
最終咱們須要寫一個 /home/shiyanlou/factorial/setup.py
,用來建立源代碼壓縮包或安裝軟件。
要建立一個源文件發佈版本,執行如下命令。
python3 setup.py sdist
咱們能在 dist 目錄下看到一個 tar 壓縮包。執行下面的命令從源代碼安裝。
sudo python3 setup.py install
Flask 是一個 web 框架。也就是說 Flask 爲你提供工具,庫和技術來容許你構建一個 web 應用程序。這個 web 應用程序能夠是一些 web 頁面、博客、wiki、基於 web 的日曆應用或商業網站。
Flask 屬於微框架(micro-framework)這一類別,微架構一般是很小的不依賴於外部庫的框架。這既有優勢也有缺點,優勢是框架很輕量,更新時依賴少,而且專一安全方面的 bug,缺點是,你不得不本身作更多的工做,或經過添加插件增長本身的依賴列表。
Flask 的依賴以下:
Web服務器網關接口(Python Web Server Gateway Interface,縮寫爲WSGI)是爲Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。自從WSGI被開發出來之後,許多其它語言中也出現了相似接口。
hello_flask.py 文件裏編寫以下代碼:
運行flask程序
瞭解了微框架、WSGI、模板引擎等概念,學習使用 Flask 作一個 web 應用,在這個 web 應用中,咱們使用了模板。而用戶以正確的不一樣 URL訪問服務器時,服務器返回不一樣的網頁。
以上是這周在實驗樓學習的關於Python3的相關知識,可是由於時間有限,不少內容還有待進一步深刻,不少內容掌握的也不是很牢固,須要在之後的學習實踐中不斷鞏固深刻。