變量
- 變量的概念基本上和初中代數(shù)的方程變量是一致的,只是在計(jì)算機(jī)程序中,變量不僅可以是數(shù)字,還可以是任意數(shù)據(jù)類型屑墨。
- 變量在程序中就是用一個(gè)變量名表示了,變量名必須是大小寫英文券勺、數(shù)字和_的組合绪钥,且不能用數(shù)字開頭。
例如:
x = 100 # 變量x是一個(gè)整數(shù)
name = 'zhangcong' # 變量name是一個(gè)字符串
Answer = True # 變量v是一個(gè)布爾值
_name = 'xxxxx' # 以下劃線開頭也是可以的关炼,但是不建議
常量
- 常量就是不能變的變量,比如常用的數(shù)學(xué)常數(shù)π就是一個(gè)常量匣吊。在Python中儒拂,通常用全部大寫的變量名表示常量
例如:
PI = 3.14159265359 # 但事實(shí)上PI仍然是一個(gè)變量,Python根本沒有任何機(jī)制保證PI不會(huì)被改變色鸳,所以社痛,用全部大寫的變量名表示常量只是一個(gè)習(xí)慣上的用法命雀,如果你一定要改變變量PI的值蒜哀,也沒人能攔住你。
字符編碼
字符編碼介紹:
- 計(jì)算機(jī)最早在設(shè)計(jì)時(shí)采用8個(gè)比特(bit)作為一個(gè)字節(jié)(byte)吏砂,所以一個(gè)字節(jié)能表示的最大整數(shù)就是255(二進(jìn)制11111111=十進(jìn)制255)撵儿,如果要表示更大的整數(shù),就必須用更多的字節(jié)狐血。比如兩個(gè)可以表示的最大整數(shù)是65535淀歇,4個(gè)字節(jié)可以表示的最大整數(shù)是4294967295。
-
計(jì)算機(jī)是美國人發(fā)明的匈织,因此最早只有127個(gè)字符編碼到計(jì)算機(jī)里浪默,也就是大小寫字母牡直、數(shù)字和一些符號(hào),這個(gè)編碼被稱為ASCII編碼纳决,比如大寫字母A的編碼是65碰逸,小寫字母z的編碼是122。
- 如果需要處理中文一個(gè)自己肯定是不夠的阔加,至少需要兩個(gè)字節(jié)饵史,而且還不能夠和ASCII編碼沖突,所以中國制定了GB2312編碼掸哑,用來把中文編進(jìn)去约急。可想而知苗分,全世界有上百種語言厌蔽,各國有各國的標(biāo)準(zhǔn),就會(huì)不可避免地出現(xiàn)沖突摔癣,結(jié)果就是奴饮,在多語言混合的文本中,顯示出來會(huì)有亂碼择浊。
- 因此戴卜,Unicode就出現(xiàn)了,Unicode把所有語言都統(tǒng)一到一套編碼里琢岩,這樣就不會(huì)再有亂碼問題了投剥。
- Unicode標(biāo)準(zhǔn)也在不斷發(fā)展,但最常用的是用兩個(gè)字節(jié)表示一個(gè)字符(如果要用到非常偏僻的字符担孔,就需要4個(gè)字節(jié))〗牵現(xiàn)代操作系統(tǒng)和大多數(shù)編程語言都直接支持Unicode。
- ASCII編碼和Unicode編碼的區(qū)別:ASCII編碼是1個(gè)字節(jié)糕篇,而Unicode編碼通常是2個(gè)字節(jié)啄育。
-
新的問題又出現(xiàn)了:如果統(tǒng)一成Unicode編碼,亂碼問題從此消失了拌消。但是挑豌,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲(chǔ)空間墩崩,在存儲(chǔ)和傳輸上就十分不劃算氓英。所以,本著節(jié)約的精神泰鸡,又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為“可變長編碼”的UTF-8編碼债蓝。UTF-8編碼把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié),常用的英文字母被編碼成1個(gè)字節(jié)盛龄,漢字通常是3個(gè)字節(jié)饰迹,只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)芳誓。如果你要傳輸?shù)奈谋景罅坑⑽淖址肬TF-8編碼就能節(jié)省空間:
字符編碼工作方式:
-
用記事本編輯的時(shí)候啊鸭,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里锹淌,編輯完成后,保存的時(shí)候再把Unicode轉(zhuǎn)換為UTF-8保存到文件:
-
瀏覽網(wǎng)頁的時(shí)候赠制,服務(wù)器會(huì)把動(dòng)態(tài)生成的Unicode內(nèi)容轉(zhuǎn)換為UTF-8再傳輸?shù)綖g覽器:
- 所以你看到很多網(wǎng)頁的源碼上會(huì)有類似<meta charset="UTF-8" />的信息赂摆,表示該網(wǎng)頁正是用的UTF-8編碼。
-
在最新的Python 3版本中钟些,字符串是以Unicode編碼的烟号,也就是說,Python的字符串支持多語言政恍,例如:
-
對(duì)于單個(gè)字符的編碼汪拥,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符:
-
如果知道字符的整數(shù)編碼篙耗,還可以用十六進(jìn)制這么寫str迫筑,兩種寫法完全是等價(jià)的:
- 由于Python的字符串類型是str,在內(nèi)存中以Unicode表示宗弯,一個(gè)字符對(duì)應(yīng)若干個(gè)字節(jié)脯燃。如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤上蒙保,就需要把str變?yōu)橐宰止?jié)為單位的bytes辕棚。
-
Python對(duì)bytes類型的數(shù)據(jù)用帶b前綴的單引號(hào)或雙引號(hào)表示:
- 要注意區(qū)分'ABC'和b'ABC',前者是str邓厕,后者雖然內(nèi)容顯示得和前者一樣坟募,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)。
-
以Unicode表示的str通過encode()方法可以編碼為指定的bytes邑狸,例如:
- 純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的涤妒,含有中文的str可以用UTF-8編碼為bytes单雾。含有中文的str無法用ASCII編碼,因?yàn)橹形木幋a的范圍超過了ASCII編碼的范圍她紫,Python會(huì)報(bào)錯(cuò)硅堆。
-
反過來,如果我們從網(wǎng)絡(luò)或磁盤上讀取了字節(jié)流贿讹,那么讀到的數(shù)據(jù)就是bytes渐逃。要把bytes變?yōu)閟tr,就需要用decode()方法:
-
可以用len()函數(shù)來計(jì)算str包含多少個(gè)字符:
-
len()函數(shù)計(jì)算的是str的字符數(shù)民褂,如果換成bytes茄菊,len()函數(shù)就計(jì)算字節(jié)數(shù):
- 可見疯潭,1個(gè)中文字符經(jīng)過UTF-8編碼后通常會(huì)占用3個(gè)字節(jié),而1個(gè)英文字符只占用1個(gè)字節(jié)面殖。
- 在操作字符串時(shí)竖哩,我們經(jīng)常遇到str和bytes的互相轉(zhuǎn)換。為了避免亂碼問題脊僚,應(yīng)當(dāng)始終堅(jiān)持使用UTF-8編碼對(duì)str和bytes進(jìn)行轉(zhuǎn)換相叁。
- 由于Python源代碼也是一個(gè)文本文件,所以辽幌,當(dāng)你的源代碼中包含中文的時(shí)候增淹,在保存源代碼時(shí),就需要?jiǎng)?wù)必指定保存為UTF-8編碼乌企。當(dāng)Python解釋器讀取源代碼時(shí)虑润,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3 # 告訴Linux/OS X系統(tǒng)逛犹,這是一個(gè)Python可執(zhí)行程序端辱,Windows系統(tǒng)會(huì)忽略這個(gè)注釋;
# -*- coding: utf-8 -*- # 告訴Python解釋器虽画,按照UTF-8編碼讀取源代碼舞蔽,否則,你在源代碼中寫的中文輸出可能會(huì)有亂碼码撰。
-
在windows中申明了UTF-8編碼并不意味著你的.py文件就是UTF-8編碼的渗柿,必須并且要確保文本編輯器正在使用UTF-8 without BOM編碼:
- 如果.py文件本身使用UTF-8編碼,并且也申明了# -- coding: utf-8 --脖岛,打開命令提示符測試就可以正常顯示中文朵栖,創(chuàng)建一個(gè)名為hello.py的文件并執(zhí)行:
#!/usr/bin/env python3
coding: utf-8
print('中文測試')
用戶交互input
在程序設(shè)計(jì)的時(shí)候,往往希望通過獲取用戶輸入的一些值柴梆,然后將獲取到的值進(jìn)行一些處理陨溅,例如:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
需求:
要求用戶輸入姓名,年齡绍在,工作门扇,然后輸出用戶的姓名,在哪年出生偿渡,用戶的工作:
'''
year = 2016 # 定義當(dāng)前年份
name = input('請(qǐng)輸入你的姓名:')
age = input('請(qǐng)輸入你的年齡:')
job = input('請(qǐng)輸入你的工作:')
year_of_birth = year - int(age) # 出生年份
print('''
姓名:%s
出生年份:%s
工作:%s
''' % (name, year_of_birth, job))
#
執(zhí)行結(jié)果:
請(qǐng)輸入你的姓名:張聰
請(qǐng)輸入你的年齡:24
請(qǐng)輸入你的工作:IT
姓名:張聰
出生年份:1992
工作:IT
格式化字符串
-
在Python中臼寄,采用的格式化方式和C語言是一致的,用%實(shí)現(xiàn)溜宽,舉例如下:
-
%運(yùn)算符就是用來格式化字符串的吉拳。在字符串內(nèi)部:%s表示用字符串替換,%d表示用整數(shù)替換适揉,有幾個(gè)%?占位符留攒,后面就跟幾個(gè)變量或者值煤惩,順序要對(duì)應(yīng)好。如果只有一個(gè)%?稼跳,括號(hào)可以省略盟庞。
-
其中,格式化整數(shù)和浮點(diǎn)數(shù)還可以指定是否補(bǔ)0和整數(shù)與小數(shù)的位數(shù):
-
如果你不太確定應(yīng)該用什么汤善,%s永遠(yuǎn)起作用什猖,它會(huì)把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串:
-
有些時(shí)候,字符串里面的%是一個(gè)普通字符怎么辦红淡?這個(gè)時(shí)候就需要轉(zhuǎn)義不狮,用%%來表示一個(gè)%:
Python的縮進(jìn)規(guī)則
- Python是強(qiáng)制縮進(jìn)的語言,它通過縮進(jìn)來確定一個(gè)新的邏輯層次的開始和結(jié)束在旱,這也是python語言的最重要的特色之一
- 同一邏輯層次級(jí)別的代碼縮進(jìn)必須保持一致
- 頂層邏輯級(jí)別的代碼必須不能有縮進(jìn)(新行的開始不能有空格)
- 整個(gè)程序的縮進(jìn)風(fēng)格應(yīng)保持一致摇零,一般為4個(gè)空格或2個(gè)空格,官方的推薦是用4個(gè)空格桶蝎,當(dāng)然用tab鍵也可以驻仅,但是在Windows上的tab鍵和Linux上的不一致,會(huì)導(dǎo)致你在Windows上開發(fā)的程序copy到Linux上后運(yùn)行出錯(cuò)登渣,所以還是建議用4個(gè)空格噪服。
注釋
- 單行注釋
單行注釋以#開頭,例如:
print 'my name is zhangcong' # 這里是注釋胜茧,python解釋器會(huì)直接忽略#后面的
- 多行注釋
多行注釋用三引號(hào)'''將注釋括起來粘优,例如:
'''
這里是多行注釋
python解釋器會(huì)忽略掉以三個(gè)單引號(hào)或雙引號(hào)開頭,三個(gè)單引號(hào)或雙引號(hào)結(jié)尾的代碼
單引號(hào)和雙引號(hào)成對(duì)出現(xiàn)呻顽,要么是一對(duì)三個(gè)單引雹顺,要么是一對(duì)三個(gè)雙引
'''
模塊初識(shí)
- Python的強(qiáng)大之處在于他有非常豐富和強(qiáng)大的標(biāo)準(zhǔn)庫和第三方庫,幾乎你想實(shí)現(xiàn)的任何功能都有相應(yīng)的Python庫支持廊遍,以后的課程中會(huì)深入講解常用到的各種庫嬉愧,現(xiàn)在,我們先來象征性的學(xué)2個(gè)簡單的喉前。
sys 模塊
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print(sys.argv)
# 輸出
$ python test.py helo world
['test.py', 'helo', 'world'] #把執(zhí)行腳本時(shí)傳遞的參數(shù)獲取到了
getpass 模塊
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:zhangcong
# Mail:zc_92@sina.com
import getpass
username = input("username:")
password = getpass.getpass("password:")
print(username,password)
# 執(zhí)行腳本后英染,輸入密碼的時(shí)候,密碼那塊是不顯示的
os模塊
#!/usr/bin/env python`
# -*- coding: utf-8 -*-`
import os
os.system(``"df -h"``)` `#調(diào)用系統(tǒng)命令`
- 跟sys模塊結(jié)合一下
import os, sys
os.system(''.join(sys.argv[1:]))#把用戶的輸入的參數(shù)當(dāng)作一條命令交給os.system來執(zhí)行`
條件判斷
- 在生活中被饿,一件事情面臨著很多選擇,比如吃飯的時(shí)候搪搏,會(huì)考慮吃什么狭握,蓋飯孽江?面條滑频?火鍋?,如果選擇吃蓋飯切心,那吃什么蓋飯,尖椒肉絲殴胧?魚香肉絲荚坞?。今妄。郑口。
- 可以用python來完成上面描述的事情:
input_value = input("請(qǐng)問想吃點(diǎn)什么,蓋飯盾鳞、面條犬性、火鍋:")
if input_value == '蓋飯':
print("您選擇的是%s!" % input_value)
elif input_value == '面條':
print("您選擇的是%s腾仅!" % input_value)
elif input_value == '火鍋':
print("您選擇的是%s乒裆!" % input_value)
else:
print("您選的%s本店沒有,謝謝光臨推励!" % input_value)
- elif是else if的縮寫鹤耍,完全可以有多個(gè)elif,所以if語句的完整形式就是:
if <條件判斷1>:
<執(zhí)行1>
elif <條件判斷2>:
<執(zhí)行2>
elif <條件判斷3>:
<執(zhí)行3>
else:
<執(zhí)行4>
- if語句執(zhí)行有個(gè)特點(diǎn)验辞,它是從上往下判斷稿黄,如果在某個(gè)判斷上是True,把該判斷對(duì)應(yīng)的語句執(zhí)行后受神,就忽略掉剩下的elif和else
-
流程圖:
循環(huán)
python中循環(huán)有兩種抛猖,分別是for循環(huán)和while循環(huán),循環(huán)可以將序列的數(shù)據(jù)進(jìn)行迭代處理:
for循環(huán)
- for循環(huán)依次把list鼻听、tuple或字符串中的每個(gè)元素迭代出來财著,例如:
names = ["zhangcong", "alex", "pangzhiguo"] for name in names: print name # 執(zhí)行結(jié)果
zhangcong
alex
pangzhiguo
- 所以for x in … 循環(huán)就是把每個(gè)元素賦值給變量x,然后執(zhí)行縮進(jìn)的語句 撑碴。
- 例:需要計(jì)算出1-10
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sum = 0 for i in numbers:
sum += i # sum += i == sum = sum + i 這里只是簡寫而已
print sum
..........................
# 執(zhí)行結(jié)果
55
- 這里列表還可以用range來代替撑教,range()函數(shù)可以生成一個(gè)整數(shù)序列,比如range(5)生成的序列是從0開始小于5的整數(shù):
sum = 0
for i in range(1, 11):
sum += i
print sum
.............................
# 執(zhí)行結(jié)果
55
官方是這么解釋range的
range(...)
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers
Return a list containing an arithmetic progression of integers. # 返回一個(gè)包含一個(gè)等差數(shù)列的整數(shù)列表醉拓。
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.
while循環(huán)
- 只要滿足條件就不斷循環(huán)伟姐,一般用死循環(huán)的時(shí)候會(huì)用到,比如我們要計(jì)算100以內(nèi)所有奇數(shù)之和亿卤,可以用while循環(huán)實(shí)現(xiàn):
# 在循環(huán)內(nèi)部變量n不斷自減愤兵,直到變?yōu)?1時(shí),不再滿足while條件排吴,循環(huán)退出
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print sum
- break:跳出當(dāng)前循環(huán)秆乳,循環(huán)結(jié)束。例如:打印1-100,當(dāng)i > 50的時(shí)候退出循環(huán)
i = 1
while True: if i > 50: breakprint i
i += 1 輸出結(jié)果: 1
2
3
4
5
6
7
8 ...
... 47
48
49
- continue:跳出本次循環(huán)屹堰,進(jìn)行下一次循環(huán)肛冶。例如:打印1-10,但是不包含5
for i in range(11): if i == 5:
continue
print i # 執(zhí)行結(jié)果
1
2
3
4
6
7
8
9
10