天天看點

第1天,Python入門

一、python簡介

python建立于1989年聖誕節期間,由荷蘭人“吉多·範羅蘇姆”(Guido van Rossum)發明,是一種面向對象的解釋型語言。

python在TIOBE排行榜,最新排行請

點選檢視

,下圖截止17年4月

第1天,Python入門

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的對應關系和執行流程如下:

    第1天,Python入門
    其他python對應關系
第1天,Python入門

執行流程

PyPy,在Python的基礎上對Python的位元組碼進一步處理,進而提升執行速度。

第1天,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
第1天,Python入門

示例

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。
第1天,Python入門

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、算數運算

第1天,Python入門

算數運算

2、比較運算

第1天,Python入門

比較運算

3、指派運算

第1天,Python入門

指派運算

4、邏輯運算

第1天,Python入門

邏輯運算

5、成員運算

第1天,Python入門

成員運算

基本資料類型

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歲我在
說謊
           

通過下圖,可以直覺的看出切片對應的輸出結果:

第1天,Python入門

切片

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()