一、python簡介
python建立于1989年聖誕節期間,由荷蘭人“吉多·範羅蘇姆”(Guido van Rossum)發明,是一種面向對象的解釋型語言。
python在TIOBE排行榜,最新排行請
點選檢視,下圖截止17年4月
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQWM0IjZzUDZhVjMjR2NwUzN0YzY5cTY3EWZ0EDOyEGZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
TIOBE開發語言排行榜
python應用領域
python可以應用于衆多領域,如:資料分析、元件內建、網絡服務、圖像處理、數值計算和科學計算等。目前業内幾乎所有大中型網際網路企業都在使用python,如:Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團等。網際網路公司廣泛使用python來做的事一般有:自動化運維、自動化測試、大資料分析、爬蟲、web等。
python與其他語言比較
計算機語言從運作效率上可以分為兩類:
- C語言
- 其他語言,如:python、Java 、C#等
C語言:代碼編譯得到機器碼,然後機器碼在處理器上直接執行
其他語言:代碼編譯後得到byte code(位元組碼),虛拟機執行位元組碼,将位元組碼轉換成機器碼,然後再在處理器上執行
python執行過程:
Python在執行時,首先會将.py檔案中的
源代碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine(Python
虛拟機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一緻的。基于C的Python編譯出的
位元組碼檔案,通常是.pyc格式。
python與C
python本身是由C語言開發而來的
對于使用:python的類庫齊全,并且文法簡潔、易讀,如果實作同樣的功能,python 10行代碼可以解決,而C可能需要100行甚至更多。
對于速度:由于python程式運作時,先将代碼編譯成位元組碼,再轉換成機器碼,然後才交給處理器執行,是以在運作效率上,相對于C,肯定是慢了。
python與Java、C#等
對于使用:Linux原裝python,其他語言沒有;以上幾門語言都有非常豐富的類庫支援,python語言簡潔性更好,相同功能,Python的代碼量更少,開發成本更少
對于速度:python在速度上可能稍顯遜色
python的種類
-
Cpython
python的官方版本,使用C語言實作,使用最為廣泛,Cpython實作會将源檔案(.py)轉換成位元組碼檔案(.pyc),然後運作在python虛拟機上。
-
Jython
由Jave語言實作的python,Jython會将python代碼動态編譯成Java位元組碼,然後在JVM(Java虛拟機)上運作。
-
IronPython
由C#語言實作的python,IronPython将Python代碼動态編譯成C#位元組碼,然後在CLR上運作(與Jython類似)。
-
PyPy(特殊)
Python實作的Python, 它的目标是執行速度,PyPy采用JIT技術,對Python代碼進行動态編譯(注意不是解釋),是以可以顯著提高python代碼的執行速度。
-
RubyPython、Brython
以上除PyPy之外,其他的Python的對應關系和執行流程如下:
其他python對應關系第1天,Python入門
執行流程
PyPy,在Python的基礎上對Python的位元組碼進一步處理,進而提升執行速度。
PyPy與Cpython對比
小結:
Python的解釋器很多,但使用最廣泛的還是CPython。如果要和Java或.Net平台互動,最好的辦法不是用Jython或IronPython,而是通過網絡調用來互動,確定各程式之間的獨立性。
二、安裝Python
windows:
1、下載下傳安裝包
https://www.python.org/downloads/2、安裝Python3.5.3
為友善查找,自定義安裝路徑:C:\python35
3、配置環境變量
【右鍵計算機】--》【屬性】--》【進階系統設定】--》【進階】--》【環境變量】--》【在第二個内容框中找到 變量名為Path 的一行,輕按兩下】 --> 【Python安裝目錄追加到變值值中,用 ; 分割】
如:原來的值;C:\python35,切記前面有分号
Linux:
無需安裝,原裝Python環境,系統自帶python2.6,如需要更高版本,請自行編譯安裝
,如需要,
請參考。
三、Python基礎
1、第一句python代碼
在Linux下 /home/dev/ 目錄下建立 hello.py 檔案,内容如下:
print "hello,world"
然後執行指令:
# python /home/dev/hello.py
hello world
指定解釋器:
在hello.py腳本檔案的頭部指定解釋器,如下:
#!/usr/bin/env python
print "hello,world"
添加執行權限
# chmod 755 hello.py
# ./hello.py
hello,world
這樣就可以像shell腳本一樣執行python腳本了
內建開發環境
(IDE:Integrated Development Environment): PyCharm
PyCharm 是由 JetBrains 打造的一款 Python IDE,支援 macOS、 Windows、 Linux 系統。
PyCharm 功能 : 調試、文法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制……
PyCharm 下載下傳位址 :
https://www.jetbrains.com/pycharm/download/破解注冊方法:
http://www.jianshu.com/p/e33e20dc2fe9示例
2、字元編碼
python解釋器在加載 .py檔案中的代碼時,會對内容進行編碼,
- python 2.x 預設編碼是ASCII(不支援中文)
- python 3.x 預設編碼是UTF-8
通常需要在代碼首部指定編碼類型,以防止因編碼類型的問題出錯
#!/usr/bin/env python
# -*- coding: utf-8 -*- #指明編碼類型為utf-8
print "你好,世界"
Pycharm 設定步驟:
- 進入 file > Settings,在輸入框搜尋 encoding。
- 找到 Editor > File encodings,将 IDE Encoding 和 Project Encoding 設定為utf-8。
3、注釋
單行注釋:
# 被注釋的内容
多行注釋:
"""
被注釋的内容
"""
注:多行注釋用三個單引号也可以。
4、.pyc檔案
執行Python代碼時,如果導入了其他的 .py 檔案,那麼,執行過程中會自動生成一個與其同名的 .pyc 檔案,該檔案就是Python解釋器編譯之後産生的位元組碼。
ps:代碼經過編譯可以産生位元組碼;位元組碼通過反編譯也可以得到代碼。
5、變量
變量定義的規則:
- 變量名隻能是字母、數字、下劃線的任意組合
- 變量名的第一個字元不能是數字
-
以下關鍵字不能聲明為變量名:
['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']
- 變量名盡量為容易了解的,讓人一眼就知道這個變量存的是什麼内容
聲明變量:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
name = "cgy" # 指派字元串變量
age = 23 # 指派整型變量
print(name)
print(age)
以上代碼中聲明了一個變量,變量名為name,變量name的值 為:"cgy"
将多行字元,指派給一個變量
info = '''
name : cgy
age : 23
gender : male
'''
列印變量類型:
print(type(name))
print(type(age))
# 輸出結果如下:
<class 'str'> # ‘str’為字元串
<class 'int'> # ‘int’為整型
多個變量指派
Python允許你同時為多個變量指派。例如:
a = b = c = 1
以上執行個體,建立一個整型對象,值為1,三個變量被配置設定到相同的記憶體空間上。
您也可以為多個對象指定多個變量。例如:
a, b, c = 1, 2, "john"
以上執行個體,兩個整型對象1和2的配置設定給變量 a 和 b,字元串對象 "john" 配置設定給變量 c。
6、互動輸入
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 将使用者輸入的内容指派給 name 變量
name = input("請輸入使用者名:")
# 列印輸入的内容
print(name)
輸入密碼時,如果想要不可見,需要利用getpass 子產品中的 getpass方法,即:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import getpass
# 将使用者輸入的内容指派給 name 變量
pwd = getpass.getpass("請輸入密碼:")
# 列印輸入的内容
print(pwd)
7、流程控制
if 單條件判斷
- 需求一、使用者登入驗證
- 提示輸入使用者和密碼
- 判斷使用者名和密碼
- 如果使用者名和密碼都正确,則輸出 ”歡迎,XXX“
- 如果錯誤,則輸出”使用者名或密碼錯誤“
代碼如下:
#!/usr/bin/env python
# -*- coding: encoding -*-
name = input('請輸入使用者名:')
pwd = getpass.getpass('請輸入密碼:')
if name == "alex" and pwd == "cmd":
print("歡迎,alex!")
else:
print("使用者名和密碼錯誤")
if 多條件判斷
- 需求二、根據使用者輸入内容輸出其權限
- cgy 為超級管理者
- cxp 為普通管理者
- cjc,cmq 為普通員工
- 其他為非法使用者
name = input('請輸入使用者名:')
if name == "cgy":
print "超級管理者"
elif name == "cxp":
print "普通管理者"
elif name == "cjc" or name == "cmq":
print "普通員工"
else:
print "非法使用者"
8、while循環
基本循環
while 條件:
循環體
- 條件成立,則循環體執行
- 條件不成立,則循環體不執行
break 跳出所有循環
#!/usr/bin/python
# -*- coding:utf-8 -*-
count = 0
while True:
if count == 5:
break
print(count)
count = count + 1
當count等于5時就跳出循環,如果沒有break,此代碼将會無限循環列印順序數字
continue 跳出目前循環,繼續下一次循環
#!/usr/bin/python
# -*- coding:utf-8 -*-
count = 0
while count < 5: # 條件為count小于時,進入循環
if count == 2:
count = count + 1
continue # 跳出目前循環,繼續下一次循環
print(count)
count = count + 1
else:
print('已循環5次')
以上代碼輸出結果如下:
0
1
3
4
已循環5次
當count等于2時,不列印。當循環超過5次,則執行else的子語句
9、for循環
最簡單的循環5次:
for i in range(5):
print("loop:", i )
輸出:
loop: 0
loop: 1
loop: 2
loop: 3
loop: 4
注:for循環中也可以使用break跳出循環和continue跳出目前循環
四、Python運算及基本資料類型
運算符
1、算數運算
算數運算
2、比較運算
比較運算
3、指派運算
指派運算
4、邏輯運算
邏輯運算
5、成員運算
成員運算
基本資料類型
6、int()整型
- 建立:
age = 23 或 age = int(23)
- 轉換:
age = '23'
new_age = int(age)
注: 在32位機器上,整數的位數為32位,取值範圍為-231~231-1,即-2147483648~2147483647
在64位系統上,整數的位數為64位,取值範圍為-263~263-1,即-9223372036854775808~9223372036854775807
7、bool()布爾值
布爾值隻有True(真)和False(假)這兩種值。
- 建立
a = True
b = False
- 轉換
- 數字轉布爾值,隻有0是False,其他都為True;
- 字元串轉布爾值,隻有""(空)是False,其他都為True;
8、字元串
name = 'cgy' 或 name = str('cgy')
age = 23
new_age = str(age)
- 字元串拼接
name = 'cgy'
gender = '男'
new_str = name + gender
print(new_str)
輸出結果:
cgy男
-
字元串格式化
占位符:
%s,字元串占位符
%d,數字占位符
name = 'cgy'
gender = '男'
age = 23
print('我叫%s,性别:%s,今年%d歲'% (name,gender,age))
我叫cgy,性别:男,今年23歲
另一種實作方式:
# 格式化輸出
name = input('name: ')
age = input('age: ')
gender = input('gender: ')
info = '''
---------- Welcome {_name} ----------
name: {_name}
age: {_age}
gender: {_gender}
'''.format(_name = name,
_age = age,
_gender = gender)
print(info)
- 判斷小字元串是否被大字元串包含
content = '東莞是男人的天堂'
if '東莞' in content:
print('包含敏感字元')
else:
print('content')
8.1字元串處理
注: 以下示例中“var”表示變量名
- 移除空白 : var.strip()
val = " alex "
print(val)
# new_val = val.strip() # 移除左右空白
# new_val = val.lstrip() # 移除左邊空白
# new_val = val.rstrip() # 移除右邊空白
# print(new_val)
- 分割 : var.split()
user_info = "alex|男|25|100萬"
v = user_info.split('|')
new_v = user_info.split('|',1) #以左邊第一個”|“為分割符
new_v_1 = user_info.rsplit('|',2) #以右邊2個"|"為分割符
print(v)
print(new_v)
print(new_v_1)
以上代碼輸出結果:
['alex', '男', '25', '100萬']
['alex', '男|25|100萬']
['alex|男', '25', '100萬']
- 字元串長度 : len(var)
username = 'cgy'
lenth = len(username)
print(lenth)
3
- 索引 : var[0]
username = '蒼井空'
u = username[0]
print(u)
蒼
周遊字元串
content = '蒼井空是你的女神'
i = 0
while i < len(content):
print(content[i])
i += 1
蒼
井
空
是
你
的
女
神
- 切片 : var[1:5:2]
name = '我叫蒼井空我今年18歲我在說謊'
print(name[0]) #列印第一個字元,預設從左邊開始數
print(name[0:2]) #取出下标0~2的字元,不包含2
print(name[5:9]) #取出從下标5開始,至9結束,不包含9
print(name[5:]) #取出從下标5開始,至結尾
print(name[5:-2]) #取出從下标5開始,至倒數第2個,負數從右邊數
print(name[-2:]) #倒數第2個,至結尾
我
我叫
我今年1
我今年18歲我在說謊
我今年18歲我在
說謊
通過下圖,可以直覺的看出切片對應的輸出結果:
切片
9、清單
注: 以下示例中 "list" 表示清單名
- 建立清單
a = ['alex', 'seven', 'eric']
或
a = list(['alex', 'seven', 'eric'])
- 判斷某個元素是否在清單中
if 'seven' in a:
print('存在')
else:
print('不存在')
- 索引 : list[0]
v1 = a[0]
v2 = a[1]
v3 = a[2]
print(v1)
print(v2)
print(v3)
# 輸出結果:
alex
seven
eric
- 長度 : len(list)
a = ['alex', 'seven', 'eric']
v = len(a)
print(v)
# 輸出結果
3
- 切片 : list[::2]
a = ['alex', 'seven', 'eric','tom']
v = a[1:3]
print(v)
# 輸出結果
['seven', 'eric']
注:清單切片與字元串切片的取值原理是一樣的,不同的是,字元串中每一個字元對應一個下标(從左往右:0,1,2,3 。。。),清單中每個元素對應一個下标。
- 追加:list.append('str')
a = ['alex', 'seven', 'eric','tom']
a.append('jerry')
print(a)
# 輸出結果:
['alex', 'seven', 'eric', 'tom', 'jerry']
- 插入 : list.insert(0,'str')
a = ['alex', 'seven', 'eric','tom']
a.insert(0,'hero') #将字元串插入到指定下标處
print(a)
# 輸出結果:
['hero', 'alex', 'seven', 'eric', 'tom']
- 删除 :list.remove('str') 或 del list[0]
# 方法一:
a = ['alex', 'seven', 'eric','tom']
a.remove('eric') # 删除指定元素
print(a)
# 輸出結果:
['alex', 'seven', 'tom']
# 方法二:
a = ['alex', 'seven', 'eric','tom']
del a[1] # 删除指定下标的元素
print(a)
# 輸出結果:
['alex', 'eric', 'tom']
- 更新 : list[1] = 'str'
a = ['alex', 'seven', 'eric','tom']
a[1] = 'maria' # 将指定下标的元素重新指派
print(a)
# 輸出結果:
['alex', 'maria', 'eric', 'tom']
- 清單循環:for i in list:
a = ['alex', 'seven', 'eric','tom']
for i in a:
print(i)
# 輸出結果:
alex
seven
eric
tom
注: for 循環中也支援break與continue
10、元組
- 建立元組
ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))
注: 元組一但建立,元組裡面的元素是不可更新的,也不可以追加插入等操作
基本操作:
- 索引 : tuple[0]
- 切片 : tuple[1:3]
- 循環 : for i in tuple:
- 長度 : len(tuple)
- 包含 : if 'str' in tuple:
11、字典
注: 字典是以鍵值對(key : value)的形式儲存資料,并且是無序的。以下示例中"dict"表示字典名。
- 建立字典
person = {"name": "mr.wu",
"gender": "male",
"age": 18}
- 通過key擷取value : dict['key']
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
v = person['name']
print(v)
# 輸出結果:
mr.wu
注:通過這種方法取值,當字典中key不存在時,就會報錯,如下:
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
v = person('address')
print(v)
# 報錯資訊如下:
Traceback (most recent call last):
File "D:/PycharmProjects/s17/S18/day01複習.py", line 52, in <module>
print(person['address'])
KeyError: 'address'
字典person中沒有'address' 這個key,就報錯了。是以就有了安全的方法:dict.get('key')
- 安全的擷取值 : dict.get('key')
注:當有此key時,傳回對應value值,沒有此key時,傳回None
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
v = person.get('address')
print(v)
# 輸出結果
None
- 增加或修改:dict['key'] = 'str'
注:有,則修改;無,則增加
有:
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
person['name'] = 'Tom'
print(person)
# 輸出結果:
{'age': 18, 'gender': 'male', 'name': 'Tom'}
無:
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
person['address'] = 'Beijin'
print(person)
# 輸出結果:
{'name': 'mr.wu', 'gender': 'male', 'age': 18, 'address': 'Beijin'}
- 删除 : del dict['key'] 或 dict.pop['key']
# 方法一、
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
del person['gender']
print(person)
# 輸出結果:
{'age': 18, 'name': 'mr.wu'}
# 方法二、
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
person.pop('age')
print(person)
# 輸出結果:
{'gender': 'male', 'name': 'mr.wu'}
- 循環
- 取出所有key : value
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
for i in person:
print(i,person[i])
# 輸出結果:
age 18
gender male
name mr.wu
或者:
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
for i in person.items():
print(i)
# 輸出結果:
('age', 18)
('name', 'mr.wu')
('gender', 'male')
注:第一種方法要比第二種方法更高效,因為第一種方法是直接根據key去取對應的value,而第二種方法則是先将字典中的(key : value)轉換成元組,然後再周遊元組,取出對應key:value
- 取出所有key
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
for i in person:
print(i)
# 輸出結果:
name
gender
age
for i in person.keys():
print(i)
# 兩種方法輸出結果完全一樣
- 取出所有value
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
for i in person:
print(person[i])
# 輸出結果:
18
male
mr.wu
for i in person.values():
print(i)
# 兩種方法輸出結果一樣
-
字典長度:len(dict)
每組key:value為一個元素
person = {"name": "mr.wu",
"gender": "male",
'age': 18}
print(len(person))
# 輸出結果:
3
注:清單與字典可以互相嵌套
五、其他
1、enumerate(list)
列印清單中的元素的下标及對應元素值
方法一:
以元組的形式輸出
a = ['alex', 'seven', 'eric','tom']
for i in enumerate(a):
print(i)
# 輸出結果:
(0, 'alex')
(1, 'seven')
(2, 'eric')
(3, 'tom')
方法二:
a = ['alex', 'seven', 'eric','tom']
for index,item in enumerate(a):
print(index,item)
# 輸出結果:
0 alex
1 seven
2 eric
3 tom
2、range
指定範圍,生成指定的數字
print range(1, 10)
# 結果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
print range(1, 10, 2)
# 結果:[1, 3, 5, 7, 9]
print range(30, 0, -2)
# 結果:[30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2]
3、join
用指定字元連接配接清單中的元素
var = ['cgy', '123456', '3']
a = '|'.join(var)
print(a)
輸出結果:
cgy|123456|3
注:通過 join 連接配接的清單中的元素都必須是字元串,否則會報錯。
4、三元運算指派
result = val_1 if 條件 else val_2
條件為真:result = val_1
條件為假:result = val_2
5、檔案操作
- 打開并讀取檔案内容
f1 = open('file','r')
data = f1.read()
f1.close()
- 清空并寫入
target = """alex|123123|3\neric|123123|3"""
f2 = open('file','w')
f2.write(target)
f2.close()