這個文檔的由來是公司內部UI自動化測試培訓的資料。部門爲了減少測試工作量,準備做UI自動化測試。我寫python,其他同事都是java,所以python基礎和UI自動化測試selenium的培訓就由我來完成。
完整教程包括4篇內容,本篇是python的基礎內容,高手請跳過。雖然是基礎,但是可以看做是一個python的微型教程,如果想了解python,簡單上手嘗試,這個教程適合。
UI 自動化測試相關內容:
前言
Python 是一門上手非常快的語言,學習python這門編程語言達到能夠正常使用的程度,需要掌握的點包括:
- 語言基礎特性
- 數據類型
- 流程控制
- 函數調用
- 面向對象
- 模塊與包
下面從這6個方面來快速熟悉python語言
語言基礎特性
解釋性語言
程序執行原理:
計算機不能直接理解高級語言,只能理解和運行機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能運行高級語言所編寫的程序。
編譯型:
程序在執行之前需要一個專門的編譯過程,把程序編譯成爲機器語言的文件,運行時不需要重新翻譯,直接使用編譯的結果就行了。
編譯型語言:
C/C++、Golang。典型的就是C語言可以編譯後生成可執行文件,之後無需再次編譯,直接運行可執行文件即可。
解釋型:
程序不需要編譯,程序在運行時才翻譯成機器語言,每執行一次都要翻譯一次。因此效率比較低。
解釋型語言:
C#、PHP、JavaScript、Perl、Python、Ruby 等等
Python 是一個解釋性語言,Python解釋器首先會將python程序編譯成中間文件 .pyc 文件,然後解釋器執行pyc文件。
優缺點
- WEB開發——最火的Python web框架Django, 支持異步高併發的Tornado框架,短小精悍的flask,bottle。
- 網絡編程——支持高併發的Twisted網絡框架, py3引入的asyncio使異步編程變的非常簡單
- 爬蟲——爬蟲領域,Python幾乎是霸主地位,Scrapy\Request\BeautifuSoap\urllib等,想爬啥就爬啥
- 雲計算——目前最火最知名的雲計算框架就是OpenStack,Python現在的火,很大一部分就是因爲雲計算
- 人工智能—— Python 是目前公認的人工智能的必備語言,pytorch和tensorflow等框架都是用python編寫
- 自動化運維 devops ——問問中國的每個運維人員,運維人員必須會的語言是什麼?10個人相信會給你一個相同的答案,它的名字叫Python
- 金融分析——金融行業寫的好多分析程序、高頻交易軟件就是用的Python。到目前Python是金融分析、量化交易領域裏用的最多的語言
- 科學運算—— 97年開始,NASA就在大量使用Python在進行各種複雜的科學運算,隨着NumPy, SciPy, Matplotlib, Enthought librarys等衆多程序庫的開發,使的Python越來越適合於做科學計算、繪製高質量的2D和3D圖像。和科學計算領域最流行的商業軟件Matlab相比,Python是一門通用的程序設計語言,比Matlab所採用的腳本語言的應用範圍更廣泛
性能問題
python最大的問題就是性能問題,可以參考如下性能測試。
但是python並不是不能支持大型項目。比如facebook的很多大型後臺服務都是python項目。
Twitter 勁敵 Threads,“魔改”了哪些 Python 技術棧?
新手小提示:如果在此之前沒有接觸過python編程,想要嘗試復現本教程中的示例,可以通過如下幾步:
- 找到一個linux服務器
- 在命令行中輸出python3,進入python解釋器中
- 逐條輸入代碼
數據類型
Python 有數據類型,但是變量定義時不需要指定變量的類型。格式:
變量 = 數值
對比java,C++等需要指明變量的類型
int d = 3
數值
整型:可以存儲無限大的數字,理論上沒有上限
>>> score = 100
>>> print(score)
100
浮點型:沒有精度限制
>>> pi = 3.1415926
>>> print(pi)
3.1415926
布爾:用True和False表示布爾類型。True可以當成數值1來用,False可以當成0來用
>>> is_vip = True
>>>
>>> print(is_vip)
True
>>> has_error = False
>>> has_error == 0
True
複數:一個實數和一個虛數組合構成,表示爲:x+yj
>>> a = 100+50j
>>> print(a)
(100+50j)
字符串
string = "hello world"
訪問:使用下標直接訪問字符串中的特定字符。可以正索引,也可以負索引
string = "hello world"
>>> string = "hello world"
>>> string[1]
'e'
>>> string[-1]
'd'
>>>
切片:所謂切片就是獲取序列的一個連續子序列。字符串切片語法是:[start:end],取到的範圍是下標start開始到end-1,也就是所謂的左閉右開
>>> string[1:4]
'ell'
>>> string[1:]
'ello world'
>>> string[1:100]
'ello world'
>>>
列表
列表是一種容器類型,類似於數組,按照順序排序元素。但是存入的元素沒有數據類型的約束,可以是任意類型。
特點:無限長度、可以存入任意類型的數據結構
創建:使用中括號創建列表
>>> arr = [1, 2, 3, 4, 5]
>>> arr
[1, 2, 3, 4, 5]
訪問:可以索引訪問,支持切片,支持負索引,支持按步長訪問
# 索引
>>> arr
[1, 2, 3, 4, 5]
>>> arr[1]
2
# 切片
>>> arr[1: -1]
[2, 3, 4]
>>>
>>> arr[:3]
[1, 2, 3]
>>>
# 按步長訪問,訪問下標0-8的元素,步長爲2
>>> arr = [1,2,3,4,5,6,7,8,9]
>>> arr[0:9:2]
[1, 3, 5, 7, 9]
添加:append 在尾部追加 ;insert 在任意下標插入數據
>>> arr
[1, 2, 3, 4, 5]
>>> arr.append(10)
>>> arr
[1, 2, 3, 4, 5, 10]
>>>
>>> arr.insert(0, -1)
>>> arr
[-1, 1, 2, 3, 4, 5, 10]
刪除:pop()刪除隊列末尾; pop(index)刪除指定下標; remove(value) 刪除指定值
>>> arr
[-1, 1, 2, 3, 4, 5, 10]
>>> arr.pop()
10
>>> arr.pop(0)
-1
>>> arr.remove(5)
>>> arr
[1, 2, 3, 4]
元組
元組和列表類似,但是元組是不可修改,刪除元素。
特點:不可刪除和修改元素,是不可變序列
創建:創建一個元組有兩種方法,分別是小括號和tuple關鍵字
>>> num = (10, 20, 30, 40, 50)
>>> num
(10, 20, 30, 40, 50)
>>> type(num)
<class 'tuple'>
>>>
>>> list1 = ["python", "java", "C++"]
>>> tup1 = tuple(list1)
>>> tup1
('python', 'java', 'C++')
>>>
訪問:可以通過下標和切片的方式訪問元組
>>> num
(10, 20, 30, 40, 50)
>>> num[1]
20
>>> num[1:10]
(20, 30, 40, 50)
>>>
字典
字典也是一種容器類型,java中叫hashmap,是由鍵值對組成的數據結構。
特點:訪問時間複雜度爲常數
創建:通過大括號和dict關鍵字都可以創建字典
>>> p_dict = {"name": "xiaozhang", "age": 18, "finish_course": False}
>>>
>>> p_dict
{'name': 'xiaozhang', 'age': 18, 'finish_course': False}
訪問:字典通過key來訪問value,一共有兩種訪問方式[]和get方法。
>>> p_dict["name"]
'xiaozhang'
# 取不到值會報錯
>>> p_dict["height"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'height'
# 取不到值不會報錯
>>> p_dict.get("age")
18
>>> p_dict.get("height")
>>> p_dict.get("height", 0)
0
添加:兩種添加方法,增加keyvalue鍵值對和更新另一個字典
>>> p_dict["height"] = 180
>>>
>>> p_dict.update({"phone": 12306})
>>>
>>>
>>> p_dict
{'name': 'xiaozhang', 'age': 18, 'finish_course': False, 'height': 180, 'phone': 12306}
刪除:兩種刪除方法,pop刪除指定key,popitem()隨機刪除一個
>>> p_dict.pop("age")
18
>>> p_dict.popitem()
('phone', 12306)
>>>
集合
python中的集合,和數學中的集合概念一樣,用來保存不重複的元素,即集合中的元素都是唯一的,互不相同。
特點:元素不重複,只能存儲不可變的數據類型,包括整形、浮點型、字符串、元組,無法存儲列表、字典、集合這些可變的數據類型。
創建:
從形式上看,和字典類似,Python 集合會將所有元素放在一對大括號 {} 中,相鄰元素之間用“,”分隔,如下所示:
>>> set1 = {1,2,3,4,5}
>>> set1
{1, 2, 3, 4, 5}
>>> type(set1)
<class 'set'>
訪問:集合不支持單個元素訪問,可以遍歷全部
添加:使用add添加元素
>>> set1.add(100)
>>> set1
{1, 2, 3, 4, 5, 100}
刪除:使用remove刪除指定值,如果不存在該值會拋出異常
>>> set1.remove(4)
>>> set1
{1, 2, 3, 5, 100}
集合操作:集合支持數學意義上的集合的操作,包括:兩個集合取交集、差集、並集、補集
# 差集
>>> set1 = {1, 2, 3}
>>> set2 = {1, 4, 5}
>>> set1 - set2
{2, 3}
# 並集
>>> set1 | set2
{1, 2, 3, 4, 5}
# 補集
>>> set1 ^ set2
{2, 3, 4, 5}
# 交集
>>> set1 & set2
{1}
流程控制
條件判斷
python使用if關鍵字做條件判斷,語法特點:
- 使用縮進對齊來確定代碼塊
- 使用冒號標誌結束
>>> age = 20
>>> if age >= 18:
... print("成年人")
... else:
... print("未成年人")
...
成年人
循環語句
python只有兩種循環語法,分別是for循環和while循環,沒有do while這種語法
for循環
python中的for循環使用in這個關鍵字,從待循環的容器中取出每一個元素,賦值給循環標識i
>>> ikun = ["雞", "你", "太美"]
>>> for i in ikun:
... print(i)
...
雞
你
太美
java for循環和python for循環對比
public class Test {
public static void main(String[] args) {
for(int x = 0; x < 20; x = x+1) {
System.out.print(x);
}
}
}
>>> print(list(range(20)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
for i in range(20):
print(i)
java for循環是讓變量x不斷自增,直到大於20退出循環,python for循環是range(20)生成一個從0到19的容器,每次取出一個元素賦值給i。
while
while 遇到條件不滿足則退出,和其他語言類似
>>> index = 10
>>> while index > 0:
... print(index)
... index = index - 1
...
10
9
8
7
6
5
4
3
2
1
函數調用
函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。函數能提高應用的模塊性,和代碼的重複利用率。
函數定義
def get_vip(score):
if not isinstance(score, int):
print("輸入不是數字")
return
if score >= 60:
return True
else:
return False
is_vip = get_vip(88)
print(is_vip)
>>>
True
定義函數通過def關鍵字開始,冒號結束。函數代碼塊以統一縮進標識。
函數返回
python中函數返回有一個特性:函數可以返回多個值,如:
def get_vip(score):
is_vip = False
is_super_vip = False
if score > 60:
is_vip = True
if score > 90:
is_super_vip = True
return is_vip, is_super_vip
vip, super_vip = get_vip(88)
>>> vip
True
>>> super_vip
False
如上示例返回兩個值,函數調用時也需要用兩個值接收,否則會拋出異常。
面向對象
類和實例
使用關鍵字class定義,class後面緊接着是類名。類名通常是大駝峯命名
class Person(object):
pass
object 是Student繼承的類,如果沒有繼承任何類可以省略括號以及裏面的內容。
實例
類是抽象的模板,比如Person類,而實例是根據類創建出來的一個具體的對象。python不需要任何關鍵字就能實例化一個對象,使用函數調用的方法就能創建一個實例。
one_person = Person()
屬性
python面向對象中,變量叫做屬性
class Person:
def __init__(self, name, job):
self.name = name
self.job = job
name = "馬保國"
job = "渾元形意太極門掌門人"
p = Person(name, job)
print(f"朋友們好啊, 我是{p.job}{p.name}")
方法
python面向對象中,函數叫做方法
class Person:
def __init__(self, name, job):
self.name = name
self.job = job
def say(self):
print("這兩個年輕人不講武德!來,騙,來偷襲我69歲的老同志。我勸這位年輕人,耗子尾汁")
name = "馬保國"
job = "渾元形意太極門掌門人"
p = Person(name, job)
p.say()
構造方法
在python的類中有一個特殊的方法用於實例創建時初始化,就是構造方法。
類就如同一個模板,通過類創建的實例肯定是千差萬別的。實例在創建時可以傳入屬於自己的屬性,在python中就是通過這個構造方法__init__來實現。
class Person:
def __init__(self, name, job):
self.name = name
self.job = job
在創建實例時傳入name 和 job 兩個參數
name = "馬保國"
job = "渾元形意太極門掌門人"
p = Person(name, job)
後續整個實例都可以使用該初始化的參數
class Person:
def __init__(self, name, job):
self.name = name
self.job = job
def introduce(self):
print(f"朋友們好啊, 我是{self.job}{self.name}")
對比java中也有構造方法
public class worker{
public String name;
public int age;
public Worker(String name, int age){
this.name = name;
this.age = age;
}
public String toString() {
return "大家好!我是新來的員工,我叫"+name+",今年"+age+"歲。";
}
}
模塊與包
模塊
python中代碼是通過模塊和包管理的。
一個 py 文件就是一個模塊。
包
包是保存幾個模塊的文件夾,包中通常包含幾個py文件和一個__init__.py的特殊文件。__init__.py
用於標識該文件夾是一個包。
Python 網絡請求最常用的庫requests目錄賞析,每一個包的目錄下面都有一個__init__.py文件。
安裝第三方包
安裝第三方包,炫酷進度條。
pip install alive-progress
from alive_progress.styles import showtime # 使用from import關鍵字導入模塊
showtime()
python基礎知識介紹到這裏就結束了,UI自動化測試Selenium請參考另一篇 selenium 開源UI測試工具