文/Bruce.Liu1
1.運(yùn)算符
本章節(jié)主要說(shuō)明Python的運(yùn)算符殊霞。舉個(gè)簡(jiǎn)單的例子 4 +5 = 9 摧阅。 例子中,4 和 5 被稱為操作數(shù)绷蹲,"+" 稱為運(yùn)算符棒卷。
Python語(yǔ)言支持以下類型的運(yùn)算符:
- 算術(shù)運(yùn)算符
- 比較(關(guān)系)運(yùn)算符
- 賦值運(yùn)算符
- 邏輯運(yùn)算符
- 成員運(yùn)算符
- 身份運(yùn)算符
- 位運(yùn)算符
- 運(yùn)算符優(yōu)先級(jí)
1.1.算術(shù)運(yùn)算
- 以下假設(shè)變量: a=10,b=20:
以下運(yùn)算結(jié)果是多少?
>>> 10 / 3 + 2.5
1.2.比較運(yùn)算
- 以下假設(shè)變量: a=10祝钢,b=20:
Python 3以后丟棄<>方式
1.3.賦值運(yùn)算
- 以下假設(shè)變量a為10比规,變量b為20:
1.4.邏輯運(yùn)算
- Python語(yǔ)言支持邏輯運(yùn)算符,以下假設(shè)變量 a 為 10, b為 20:
- or(或)示例
>>> a - b > 0 or b == a + 10
True
- and(與)示例
>>> a + 10 == b and b - a == 10
True
- not(非)示例
>>> a
10
>>> not a
False
1.5.成員運(yùn)算
- 除了以上的一些運(yùn)算符之外拦英,Python還支持成員運(yùn)算符蜒什,測(cè)試實(shí)例中包含了一系列的成員,包括字符串疤估,列表或元組灾常。
- 判斷成員是否在字符串霎冯、列表、元組中
>>> res_list = range(10)
>>> 5 in res_list
True
- 判斷成員是否不在字符串钞瀑、列表沈撞、元組中
>>> test_code = 'Hello World'
>>> 'L' not in test_code
True
1.6.身份運(yùn)算
- is示例驗(yàn)證兩個(gè)標(biāo)識(shí)符來(lái)自同一個(gè)引用
>>> def main():
... pass
...
>>> result = main()
>>> result is None
True
- 以下代碼和"sql result"做 == is運(yùn)算返回是否相等
>>> a = 'sql result'
>>> a is 'sql result'
False
>>> a == 'sql result'
True
- is not 示例驗(yàn)證兩個(gè)標(biāo)識(shí)符來(lái)自不同引用
>>> a is not 'sql result'
True
1.7.位運(yùn)算
- 按位運(yùn)算符是把數(shù)字看作二進(jìn)制來(lái)進(jìn)行計(jì)算的。Python中的按位運(yùn)算法則如下:
- 下表中變量 a 為 60雕什,b 為 13缠俺,二進(jìn)制格式如下:
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
- 利用 bin() eval() int()方法,方便二贷岸、十進(jìn)制的轉(zhuǎn)換
>>> a = 60
>>> binary_a = bin(a)
'0b111100'
>>> eval(binary_a)
60
>>> int(binary_a,2)
60
1.8.運(yùn)算符優(yōu)先級(jí)
- 以下表格列出了從最高到最低優(yōu)先級(jí)的所有運(yùn)算符:
簡(jiǎn)單溫習(xí)一下小學(xué)數(shù)學(xué)
>>> a = 20
>>> b = 10
>>> c = 15
>>> d = 5
>>> e = 0
>>> e = (a + b) * c / d
>>> print "(a + b) * c / d 運(yùn)算結(jié)果為:", e
(a + b) * c / d 運(yùn)算結(jié)果為: 90
>>> e = ((a + b) * c) / d
>>> print "((a + b) * c) / d 運(yùn)算結(jié)果為:", e
((a + b) * c) / d 運(yùn)算結(jié)果為: 90
2.條件語(yǔ)句
Python條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True或者False)來(lái)決定執(zhí)行的代碼塊壹士。
可以通過(guò)下圖來(lái)簡(jiǎn)單了解條件語(yǔ)句的執(zhí)行過(guò)程:
2.1.用戶登錄驗(yàn)證
2.1.1.基本控制子句
- 用戶輸入賬戶名和密碼顽染,根絕輸入的對(duì)錯(cuò)提示不同的消息
#!/bin/env python
#! _*_ coding:utf-8 _*_
import getpass
username = 'liu'
password = '745'
users = raw_input('Enter your name: ')
pwds = getpass.getpass('password : ')
if username == users and password == pwds :
print('Welcome user {_name}'.format(_name = users))
else:
print('invalid username or password!')
2.1.2.多重控制子句
2.1.2.1.多重控制子句-1
- 猜年齡程序一铅,基于用戶輸入的年齡返回是否正確,及提示差距
問(wèn):當(dāng)輸入18的時(shí)候睛榄,到底是返回那個(gè)結(jié)果?
#!/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "Bruce"
age_of_python = 30
guess_age = raw_input('Enter age: ')
if guess_age < age_of_python:
print('think bigger!')
elif guess_age == 18:
print('成年了户敬,騷年!')
elif guess_age > age_of_python:
print('think smaller!')
else:
print('yes. you got it.')
現(xiàn)實(shí)總是這么的讓人茫然落剪,結(jié)果總是太出乎人的意料,think smaller!尿庐,python BUG?
# python 3_guess.py
Enter age: 18
think smaller!
2.1.2.1.多重控制子句-2
raw_input 函數(shù)接收的參數(shù)都將以str類型返回
input 函數(shù)將接收的參數(shù)數(shù)據(jù)類型原樣返回
3.x python 取消了input方法,raw_input方法改成成input()
- 此時(shí)在問(wèn):當(dāng)輸入18的時(shí)候忠怖,到底是返回那個(gè)結(jié)果?
#!/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "Bruce"
age_of_python = 30
#guess_age = input('Enter age: ')
guess_age = int(raw_input('Enter age: '))
if guess_age < age_of_python:
print('think bigger!')
elif guess_age == 18:
print('成年了,騷年!')
elif guess_age > age_of_python:
print('think smaller!')
else:
print('yes. you got it.')
3.循環(huán)語(yǔ)句
循環(huán)語(yǔ)句允許我們執(zhí)行一個(gè)語(yǔ)句或語(yǔ)句組多次抄瑟,下面是在大多數(shù)編程語(yǔ)言中的循環(huán)語(yǔ)句的一般形式:
- Python提供了for循環(huán)和while循環(huán)
- 循環(huán)控制語(yǔ)句可以更改語(yǔ)句執(zhí)行的順序凡泣。Python支持以下循環(huán)控制語(yǔ)句:
3.1.loop循環(huán)
3.1.1.簡(jiǎn)單的Loop循環(huán)
>>> for i in range(10):
... print 'Loop:',i
...
Loop: 0
Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5
Loop: 6
Loop: 7
Loop: 8
Loop: 9
3.1.2.循環(huán)控制語(yǔ)句
循環(huán)控制語(yǔ)句可以更改語(yǔ)句執(zhí)行的順序
3.1.2.1.循環(huán)控制語(yǔ)句continue
continue子句的作用:停止并跳出當(dāng)前本次循環(huán),執(zhí)行下一次循環(huán)
打印1到100數(shù)字皮假,打印到50的時(shí)候顯示特殊信息
>>> for i in range(100):
... if i == 50:
... print 'I have got to the round 50th!'
... continue
... print i
3.1.2.2.循環(huán)控制語(yǔ)句break
break子句的作用:終止循環(huán)鞋拟,并跳出整個(gè)循環(huán)體
打印1到100數(shù)字,打印到50的時(shí)候顯示信息并停止程序
>>> for i in range(100):
... if i == 50:
... print 'I have got to the round 50th!'
... break
... print i
3.1.2.3.循環(huán)控制語(yǔ)句pass
僅僅是為了是代碼保持語(yǔ)法完整性的.
該代碼惹资,竟不能夠執(zhí)行贺纲,因?yàn)閜ython認(rèn)為有從屬關(guān)系的代碼塊,就必須有子代碼
>>> for i in range(10):
...
File "<stdin>", line 2
^
IndentationError: expected an indented block
改成這種方法即可褪测。這會(huì)非常有用猴誊。
>>> for i in range(10):
... pass
...
3.2.while 循環(huán)
3.2.1.無(wú)限循環(huán)
# !/bin/env python
count = 0
while True:
print 'loop:',count
count +=1
3.2.2.條件循環(huán)
打印1到100數(shù)字,打印到50的時(shí)候顯示特殊信息侮措,打印到70停止程序
#!/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "Bruce"
counter = 1
while True:
counter += 1
if counter == 50:
print 'I have got to the round 50th!'
continue
elif counter > 70:
break
print counter
3.3.嵌套循環(huán)
- 九九乘法表
>>> for i in range(1,10):
... for j in range(1,10):
... print "{} x {} = {}".format(i, j, i * j)
4.字符串操作
字符串是 Python 中最常用的數(shù)據(jù)類型懈叹。我們可以使用引號(hào)('或")來(lái)創(chuàng)建字符串。和其他語(yǔ)言一樣字符串是不可修改的分扎。
4.1.字符串基本操作
4.1.1.聲明字符串
創(chuàng)建字符串很簡(jiǎn)單澄成,只要為變量分配一個(gè)值即可。例如:
>>> msg = 'Hello World'
4.1.2.單引號(hào)、雙引號(hào)
python中沒(méi)有字符串的引用符 雙引號(hào) " 墨状、單引號(hào)'卫漫。沒(méi)有強(qiáng)引用、弱引用之說(shuō)歉胶,有些情況確需要不懂的引用方式
示例一
>>> 'hello,world!'
'hello,world!'
示例二 這種方式明顯是語(yǔ)法錯(cuò)誤。如何表示我們想要表達(dá)的意思呢?
>>> 'Let's go!'
File "<stdin>", line 1
'Let's go!'
^
SyntaxError: invalid syntax
示例三 通過(guò)雙引號(hào)表示
>>> "Let's go!"
"Let's go!"
示例四 或者通過(guò)轉(zhuǎn)移符 \將 Let's轉(zhuǎn)轉(zhuǎn)成普通字符
>>> 'Let\'s go!'
"Let's go!"
4.1.3.字符串拼接
>>> x= 'Hello,'
>>> y = 'world!'
>>> x + y
'Hello,world!'
4.1.4.訪問(wèn)字符串的值
Python訪問(wèn)子字符串巴粪,可以使用方括號(hào)來(lái)截取字符串通今,如下實(shí)例:
- 默認(rèn)(下標(biāo)0開始);[0:5]表示從下標(biāo)0開始匹配,匹配到5結(jié)束,這種方式也叫切片肛根。(切片search數(shù)據(jù)的方式是:顧頭不顧尾)
>>> msg = 'Hello World'
>>> msg[0]
'H'
>>> msg[0:5]
'Hello'
4.2.轉(zhuǎn)義字符
4.3.字符串運(yùn)算符
4.5.字符串格式化
4.6.字符串內(nèi)置方法
字符串方法是從python1.6到2.0慢慢加進(jìn)來(lái)的——它們也被加到了Jython中辫塌。
這些方法實(shí)現(xiàn)了string模塊的大部分方法,如下表所示列出了目前字符串內(nèi)建支持的方法派哲,所有的方法都包含了對(duì)Unicode的支持臼氨,有一些甚至是專門用于Unicode的。
- 獲取幫助信息
help的時(shí)候方法不需要加括號(hào)
>>> msg = 'hello world'
>>> help(msg.capitalize)
- 首字母大寫
>>> msg.capitalize()
'Hello world'
- 集中對(duì)齊
>>> msg.center(15 )
' hello world '
>>> msg.center(15 ,'#')
'##hello world##'
- 統(tǒng)計(jì)輸入?yún)?shù)出現(xiàn)的次數(shù)
>>> msg.count('l')
3
- 編碼成bytes格式
>>> msg.encode()
'hello world'
- 判斷字符串結(jié)尾是否包含輸入?yún)?shù)
>>> msg.endswith('world')
True
- 自動(dòng)以制表符的長(zhǎng)度
>>> text = 'hello\tworld'
>>> print text
hello world
>>> text.expandtabs(10)
'hello world'
- 返回字符串位置芭届,沒(méi)有則返回-1(默認(rèn)下標(biāo)0開始自左向右find储矩,找到就返回)
>>> msg.find('l')
2
>>> msg.find('x')
-1
- 格式化字符串
第一種寫法
>>> cmd = "mysql -h{ip} -P{port} -u{user} -p{passs}".format(ip='localhost',port=3306,user='mysql',passs='buzhidao')
>>> cmd
'mysql -hlocalhost -P3306 -umysql -pbuzhidao'
第二種寫法
>>> cmd = "mysql -h{0} -P{1} -u{2} -p{3}".format('localhost',3306,'mysql','buzhidao')
>>> print cmd
mysql -hlocalhost -P3306 -umysql -pbuzhidao
第三種寫法
>>> cmd = "mysql -h{} -P{} -u{} -p{}".format('localhost',3306,'mysql','buzhidao')
>>> cmd
'mysql -hlocalhost -P3306 -umysql -pbuzhidao'
- 返回字符串位置,沒(méi)有則報(bào)錯(cuò)(多個(gè)重復(fù)值時(shí)褂乍,找到第一個(gè)就返回)
>>> msg.index('l')
2
>>> msg.index('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
- 判斷是否是標(biāo)準(zhǔn)字符(0-9,a-Z)
>>> msg.isalnum()
False
>>> '09aZ'.isalnum()
True
- 判斷是否是字母(a-Z)
>>> 'asdf'.isalpha()
True
>>> 'as21'.isalpha()
False
- 判斷是否是數(shù)字(0-9)
>>> '123'.isdigit()
True
- 判斷是否是小寫
>>> msg.islower()
True
- 判斷是否是空格
>>> s = ' '
>>> s.isspace()
True
- 判斷是否是首字母大寫
>>> _msg = 'Hello World'
>>> _msg.istitle()
True
- 判斷字符串是否全部是大寫
>>> _msg = 'TEST CODE'
>>> _msg.isupper()
- 將序列中的元素以指定的字符連接生成一個(gè)新的字符串
>>> tuple_res = ('Bruce','BJ')
>>> '#'.join(tuple_res)
'Bruce#BJ'
- 顯示長(zhǎng)度持隧,不夠時(shí)右邊用空格填充
>>> msg.ljust(12)
'hello world '
- 返回字符串小寫格式
>>> _msg.lower()
'test'
- 去掉左邊的空格回車符
>>> text = '\n\taa'
>>> print text
aa
>>> text.lstrip()
'aa'
- 默認(rèn)從左側(cè)開始匹配;返回一個(gè)3元的元組逃片,第一個(gè)為分隔符左邊的子串屡拨,第二個(gè)為分隔符本身,第三個(gè)為分隔符右邊的子串
>>> names = 'Burce.Liu'
>>> names.partition('.')
('Burce', '.', 'Liu')
- 字符串替換,默認(rèn)全面替換
>>> info = '***** hotle'
>>> hotel = info.replace('*','星')
>>> print hotel
星星星星星 hotle
- 返回字符串位置褥实,沒(méi)有則返回-1
默認(rèn)(下標(biāo)0開始) 自左向右find呀狼,找到最右側(cè)的在返回
>>> msg
'hello world'
>>> msg.rfind('l')
9
>>> msg.find('a')
-1
- 從右至左返回字符串位置,沒(méi)有則報(bào)錯(cuò)(多個(gè)重復(fù)值時(shí)损离,找到第一個(gè)就返回)
>>> msg.rindex('l')
9
- 顯示長(zhǎng)度哥艇,不夠時(shí)左邊用空格填充
>>> msg.rjust(12)
' hello world'
- 從右邊開始切分,返回一個(gè)3元的元組僻澎,第一個(gè)為分隔符左邊的子串她奥,第二個(gè)為分隔符本身,第三個(gè)為分隔符右邊的子串
>>> url = 'www.hanxiang.com'
>>> url.rpartition('.')
('www.hanxiang', '.', 'com')
- 從右側(cè)開始怎棱,將字符串默認(rèn)以空格分割哩俭,分割后以list的形勢(shì)返回
>>> msg.rsplit()
['hello', 'world.', 'none..']
- 去掉右邊的空格回車符
>>> test = '\n\ttile......\n\t'
>>> print test.rstrip()
tile......
- 將字符串默認(rèn)以空格分割,分割后以list的形勢(shì)返回
>>> names.split('.')
['Burce', 'Liu']
- 按照行('\r', '\r\n', \n')分隔拳恋,返回一個(gè)包含各行作為元素的列表
>>> info = '123\n456\n789'
>>> info.splitlines()
['123', '456', '789']
- 判斷字符串首部是否包含參數(shù)值
>>> ftp_cmd = 'get file'
>>> ftp_cmd.startswith('get')
True
- 默認(rèn)脫掉兩邊的空格回車符
>>> test = '\n\ttile......\n\t'
>>> print test
tile......
>>> test.strip()
'tile......'
- 對(duì)字符串的大小寫字母進(jìn)行轉(zhuǎn)換
>>> info = 'Test Code!'
>>> info.swapcase()
'tEST cODE!'
- 返回字符串首字母大寫
>>> msg.title()
'Hello World. None..'
- 方法根據(jù)參數(shù)table給出的表(包含 256 個(gè)字符)轉(zhuǎn)換字符串的字符
>>> from string import maketrans
>>> intab = 'a'
>>> outtab = '1'
>>> # str.translate(table[, deletechars]);
>>> # table -- 翻譯表凡资,翻譯表是通過(guò)maketrans方法轉(zhuǎn)換而來(lái)。
>>> # deletechars -- 字符串中要過(guò)濾的字符列表。
>>> trantab = maketrans(intab, outtab)
>>> str = "a this is string example....wow!!!";
>>> print str.translate(trantab)
1 this is string ex1mple....wow!!!
- 返回字符串的大寫形式
>>> msg.upper()
'HELLO WORLD. NONE..'
- 方法返回指定長(zhǎng)度的字符串隙赁,原字符串右對(duì)齊垦藏,前面填充0。
>>> #返回一個(gè)值的ASCII映射值
>>> ord('2')
50
>>> #將50轉(zhuǎn)換成二進(jìn)制方式表示
>>> bin(ord('2'))
'0b110010'
>>> #用zfill方法填充默認(rèn)不夠的0
>>> binary_num.zfill(10)
'000b110010'
4.7.字符串的進(jìn)階
- 返回變量的類型
>>> type(msg)
<type 'str'>
- 返回最大值
>>> msg = 'my name is Burce1.'
>>> max(msg)
'y'
- 返回最小值
>>> min(msg)
' '
- 取長(zhǎng)度
>>> len(msg)
18
- 數(shù)據(jù)類型轉(zhuǎn)換-int
>>> one = '1'
>>> num1 = int(one)
>>> type(num1)
<type 'int'>
- 數(shù)據(jù)類型轉(zhuǎn)換-str
>>> numtwo = str(num1)
>>> type(numtwo)
<type 'str'>
- ascii轉(zhuǎn)換-1(str -> ascii)
>>> ord('a')
97
- ascii轉(zhuǎn)換-2(ascii -> str)
>>> chr(97)
'a'
- 比較兩個(gè)值的大小
>>> a = 'z'
>>> b = 'a'
>>> cmp(a,b)
1
>>> cmp(b,a)
-1
- 為每一個(gè)元素添加一個(gè)ID
>>> import string
>>> string.lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> for i in string.lowercase:
... print string.lowercase.index(i),i
...
0 a
1 b
2 c
3 d
4 e
5 f
6 g
7 h
8 i
9 j
10 k
11 l
12 m
13 n
14 o
15 p
16 q
17 r
18 s
19 t
20 u
21 v
22 w
23 x
24 y
25 z
- 想合并一組序列如何做
>>> nums = ('Bruce',27,'erha',1,'QQ',23)
>>> ','.join(nums)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 1: expected string, int found
嘗試一下代碼
>>> nums = ('Bruce',27,'erha',1,'QQ',25)
>>> result = ''
>>> for i in nums:
... if type(i) is int:
... result += '{},'.format(str(i))
... continue
... result += '{},'.format(i)
...
>>> result
'Bruce,27,erha,1,QQ,25,'
5.列表操作
列表是最常用的Python數(shù)據(jù)類型伞访,它可以作為一個(gè)方括號(hào)內(nèi)的逗號(hào)分隔值出現(xiàn)掂骏。并且列表內(nèi)的數(shù)據(jù)類型靈活多變。
列表(list)具有一下幾個(gè)特點(diǎn):
- 任意對(duì)象的有序集合
- 可變的序列
有一個(gè)需求需要存放班級(jí)所有同學(xué)的姓名厚掷,如果有同學(xué)休學(xué)或其他原因造成不能繼續(xù)上課弟灼,存放數(shù)據(jù)的結(jié)構(gòu)中還需要對(duì)應(yīng)的維護(hù),如何存放數(shù)據(jù)呢?
- 這種寫法顯然不能靈活的維護(hù)更新數(shù)據(jù),那么此時(shí)就引入了list數(shù)據(jù)類型
>>> grade = 'erha,eric,Bruce,tom'
其實(shí)通過(guò)剛才的知識(shí)就能將字符串轉(zhuǎn)換成list,那么此時(shí)grade_list就變得很好維護(hù)更新了
>>> grade_list = grade.split(',')
>>> grade_list
['erha', 'eric', 'Bruce', 'tom']
5.1.列表的基本操作
5.1.1.定義列表
name_list = ['Bruce','erha','tom','Yang']
5.1.2.訪問(wèn)列表
- 獲取list元素,默認(rèn)下標(biāo)0是第1個(gè)位置冒黑,以此類推
>>> name_list[0]
'Bruce'
>>> name_list[-1]
'Yang'
5.1.3.切片
如果說(shuō)想一次性訪問(wèn)list中多個(gè)元素如何做呢田绑?
- 取下標(biāo)1~4的元素(包括1,不包括4)
>>> names = ['Bruce','tom','jack','Yang','QQ']
>>> names[1:4]
['tom', 'jack', 'Yang']
- 取下標(biāo)2~-1的元素(-1是元素中最右側(cè)的下標(biāo))
>>> names[2:-1]
['jack', 'Yang']
- 從頭開始取抡爹,取到下標(biāo)3
>>> names[:3]
['Bruce', 'tom', 'jack']
>>> names[0:3]
['Bruce', 'tom', 'jack']
- 去最后3下標(biāo)的元素
>>> names[-3:]
['jack', 'Yang', 'QQ']
#這種是錯(cuò)誤的掩驱,因?yàn)?1在尾部不能被包含
>>> names[-3:-1]
['jack', 'Yang']
- 取下標(biāo)3之前的元素,每隔一個(gè)元素冬竟,取一個(gè)
>>> names[:3:2]
['Bruce', 'jack']
- 也可以基于切片欧穴,指定下標(biāo)2位置插入
>>> names[2:2] = ['wang da chui']
>>> names
['Bruce', 'tom', 'wang da chui', 'jack', 'Yang', 'QQ']
5.2.列表的內(nèi)置方法
- 列表末尾追加元素
>>> names = ['Bruce', 'tom', 'wang da chui', 'jack', 'Yang', 'QQ']
>>> names.append('QQ')
- 統(tǒng)計(jì)元素在列表中出現(xiàn)的個(gè)數(shù)
>>> names.count('QQ')
2
- 擴(kuò)展列表
>>> names = ['Bruce', 'tom', 'wang da chui', 'jack', 'Yang', 'QQ']
>>> names.extend(range(10))
>>> print names
等于以下方式
>>> names += range(10)
>>> print names
- 返回該元素的位置,無(wú)則拋異常泵殴,并且匹配第一個(gè)元素即返回
>>> names.index('QQ')
5
>>> names.index('Tom')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.index(x): x not in list
- 指定元素下標(biāo)插入
>>> names.insert(4,'新來(lái)的')
>>> print names[4]
新來(lái)的
- 指定下標(biāo)刪除元素并返回刪除的元素苔可,默認(rèn)不指定刪除最后一個(gè)元素
>>> names.pop(4)
'\xe6\x96\xb0\xe6\x9d\xa5\xe7\x9a\x84'
>>> names.pop()
4
- 刪除第一次出現(xiàn)的改元素
>>> names.remove('QQ')
- 倒序
>>> names.reverse()
>>> names
[3, 2, 1, 0, 'QQ', 'Yang', 'jack', 'wang da chui', 'tom', 'Bruce']
- 排序
>>> names.sort()
>>> names
[0, 1, 2, 3, 'Bruce', 'QQ', 'Yang', 'jack', 'tom', 'wang da chui']
倒序、排序都是基于首字符ascii碼的大小進(jìn)行的
5.3.列表的高級(jí)進(jìn)階
5.3.1.Enumerate枚舉
enumerate在循環(huán)的同時(shí)直接訪問(wèn)當(dāng)前的索引值
>>> for k, v in enumerate(names):
... print k, v
...
0 0
1 1
2 2
3 3
4 Bruce
5 QQ
6 Yang
7 jack
8 tom
9 wang da chui
5.3.2.找出列表中的最大值
>>> import random #隨機(jī)模塊袋狞,后面展開講解
>>>
>>> sequences = range(15)
>>> random.shuffle(sequences)
>>> d = -1
>>> for i in sequences:
... if i > d:
... d = i
...
>>> print d
14
5.3.3.列表的復(fù)制
5.3.3.1.潛復(fù)制
- 一維數(shù)據(jù)潛復(fù)制驗(yàn)證焚辅,
>>> import copy
>>> names = ['Bruce', 'Eric', 'goods cat!']
>>> names2 =copy.copy(names)
>>> names[1] = 'eric'
>>> print names
['Bruce', 'eric', 'goods cat!']
>>> print names2
['Bruce', 'Eric', 'goods cat!']
- 二維數(shù)據(jù)或多維數(shù)據(jù)中潛復(fù)制的區(qū)別
但是二維列表中發(fā)現(xiàn),其實(shí)淺復(fù)制并沒(méi)有真正的復(fù)制一個(gè)單獨(dú)的列表苟鸯,而是指向了同一個(gè)列表的指針同蜻,這就是潛復(fù)制;二維數(shù)據(jù)時(shí),潛復(fù)制并不會(huì)完全的復(fù)制一個(gè)副本
>>> shopping = [['Iphone',5800],['Nike',699],'buy']
>>> copy_shopping = copy.copy(shopping)
>>> shopping[0][0]
'Iphone'
>>> shopping[0][1] = 5699
>>> print shopping
[['Iphone', 5699], ['Nike', 699], 'buy']
>>> print copy_shopping
[['Iphone', 5699], ['Nike', 699], 'buy']
- 潛復(fù)制也并非雞肋早处,我們看一場(chǎng)景:
父子卡賬戶擁有相同的一個(gè)卡號(hào)和金額湾蔓,但是名字不同,發(fā)生扣款時(shí)金額必須同時(shí)扣款
>>> blank_user = ['names',['blank_name','card_type',0]]
>>> Tom = ['犀利哥',['光大','儲(chǔ)值卡',800]]
>>> jery = copy.copy(Tom)
>>> jery[0] = '鳳姐'
>>> jery[1][2] = 800 - 699
>>> print jery[0],jery[1][2]
鳳姐 101
>>> print Tom[0],Tom[1][2]
犀利哥 101
5.3.3.2.深復(fù)制
- 深復(fù)制才是真正的將多維元素進(jìn)行完全的copy(類似于軟連接砌梆、硬鏈接)
>>> shopping = [['Iphone',5800],['Nike',699],'buy']
>>> deepcopy_shopping = copy.deepcopy(shopping)
>>> shopping[0] = ['Iphone Plus','8800']
>>> shopping
[['Iphone Plus', '8800'], ['Nike', 699], 'buy']
>>> deepcopy_shopping
[['Iphone', 5800], ['Nike', 699], 'buy']
5.3.4.列表的轉(zhuǎn)換
- str轉(zhuǎn)換list
>>> import string
>>> result = string.uppercase
>>> list_res = list(result)
>>> print list_res
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
- list轉(zhuǎn)換str
str方法僅僅是將數(shù)據(jù)結(jié)構(gòu)外面用引號(hào),這并不是我們想要的結(jié)果
>>> str(list_res)
"['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']"
- 正確的姿勢(shì)
>>> ''.join(list_res)
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
補(bǔ)充
- zip拉鏈
兩個(gè)列表長(zhǎng)度不一致默责,zip拉鏈的時(shí)候,自動(dòng)截取一致
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8, 9]
>>> zip(a,b)
[(1, 5), (2, 6), (3, 7), (4, 8)]
兩遍元數(shù)量一樣的效果
>>> a.append('new')
>>> zip(a,b)
[(1, 5), (2, 6), (3, 7), (4, 8), ('new', 9)]
- map方法
如果list長(zhǎng)度不一致咸包,則用None補(bǔ)充
>>> b.append(10)
>>> map(None,a,b)
[(1, 5), (2, 6), (3, 7), (4, 8), ('new', 9), (None, 10)]
6.元組操作
元組:tuple桃序。tuple和list非常類似,但是tuple一旦初始化就不能修改烂瘫,比如同樣是列出同學(xué)的名字媒熊、函數(shù)或其他對(duì)象的返回結(jié)果都是元組形式
元組(tuple)具有以下幾個(gè)特點(diǎn):
- 任意對(duì)象的有序集合
- 不可變的序列
6.1.元組的基本操作
6.1.1.聲明一個(gè)元組
>>> db_res = ('as','the','is','at','go')
6.1.2.訪問(wèn)元組
>>> db_res[0]
'as'
因?yàn)樵M是只讀的所以沒(méi)有過(guò)多關(guān)于修改的內(nèi)置函數(shù),也不支持修改元組中的元素
>>> db_res[0] = 'Change'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
6.2.元組的內(nèi)置方法
- 統(tǒng)計(jì)元素出現(xiàn)的次數(shù)
>>> db_res.count('as')
1
- 返回元素的下標(biāo)位置
>>> db_res.index('at')
3
補(bǔ)充
- tuple -> list
>>> list_db_res = list(db_res)
>>> print list_db_res
['as', 'the', 'is', 'at', 'go']
- list -> tuple
>>> db_res_2 = tuple(list_db_res)
>>> print db_res_2
('as', 'the', 'is', 'at', 'go')
- tuple -> str
result_tuple = ('Tablespace->', 'INDEX_PAY', 'TotalSize->', 69632, 'FreeSize->', 14293.0625, 'UsedSize->', 55338.9375, 'FreePencent->', 20.52)
>>> tmp_res = ''
>>> for i in result_tuple:
... tmp_res += str(i)
>>> print tmp_res
Tablespace->INDEX_PAYTotalSize->69632FreeSize->14293.0625UsedSize->55338.9375FreePencent->20.52
7.字典操作
Python內(nèi)置了字典:dict的支持,dict全稱dictionary芦鳍,在其他語(yǔ)言中也稱為map嚷往,使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度柠衅。
字典(dict)具有以下幾個(gè)特點(diǎn):
- 任意對(duì)象的無(wú)序集合
- 可變的序列
- Search元素效率極高
為什么dict查找速度這么快皮仁?因?yàn)閐ict的實(shí)現(xiàn)原理和查字典是一樣的。假設(shè)字典包含了1萬(wàn)個(gè)漢字菲宴,我們要查某一個(gè)字贷祈,一個(gè)辦法是把字典從第一頁(yè)往后翻,直到找到我們想要的字為止裙顽,這種方法就是在list中查找元素的方法付燥,list越大宣谈,查找越慢愈犹。
第二種方法是先在字典的索引表里(比如部首表)查這個(gè)字對(duì)應(yīng)的頁(yè)碼,然后直接翻到該頁(yè)闻丑,找到這個(gè)字漩怎,無(wú)論找哪個(gè)字,這種查找速度都非赤挛耍快勋锤,不會(huì)隨著字典大小的增加而變慢。
dict就是第二種實(shí)現(xiàn)方式侥祭,給定一個(gè)名字叁执,比如'Michael',dict在內(nèi)部就可以直接計(jì)算出Michael對(duì)應(yīng)的存放成績(jī)的“頁(yè)碼”矮冬,也就是95這個(gè)數(shù)字存放的內(nèi)存地址谈宛,直接取出來(lái),所以速度非程ナ穑快吆录。
你可以猜到,這種key-value存儲(chǔ)方式琼牧,在放進(jìn)去的時(shí)候恢筝,必須根據(jù)key算出value的存放位置,這樣巨坊,取的時(shí)候才能根據(jù)key直接拿到value撬槽。
- 假設(shè)要根據(jù)同學(xué)的名字查找對(duì)應(yīng)的成績(jī),如果用list實(shí)現(xiàn)趾撵,需要兩個(gè)list
給定一個(gè)名字恢氯,要查找對(duì)應(yīng)的成績(jī),就先要在names中找到對(duì)應(yīng)的位置,再?gòu)膕cores取出對(duì)應(yīng)的成績(jī)勋拟,list越長(zhǎng)勋磕,耗時(shí)越長(zhǎng)。
>>> names = ['Michael', 'Bob', 'Tracy']
>>> scores = [95, 75, 85]
- 如果用dict實(shí)現(xiàn)敢靡,只需要一個(gè)“名字”-“成績(jī)”的對(duì)照表挂滓,直接根據(jù)名字查找成績(jī),無(wú)論這個(gè)表有多大啸胧,查找速度都不會(huì)變慢赶站。用Python寫一個(gè)dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
7.1.字典的基本操作
7.1.1.聲明一個(gè)字典
- 如創(chuàng)建一個(gè)員工信息
>>> contacts = { '3951' : ['Bruce','IT','DBA'], '3091' : ['Jack','HR','HR'], '5122' : ['BlueTShirt','Sales','SecurityGuard'] }
7.1.2.訪問(wèn)字典中的元素
>>> contacts['3951'][0]
'Bruce'
7.1.3.添加字典中的元素
- 沒(méi)有key,默認(rèn)就是添加
>>> contacts['5927'] = ['Tang','BUG','土豪不需要職業(yè)']
>>> print contacts['5927'][2]
土豪不需要職業(yè)
7.1.4.修改字典中的元素
- 存在的key纺念,就是修改
>>> contacts['5927'][0] = 'TangYan'
>>> contacts['5927'][0]
'TangYan'
7.2.字典的內(nèi)置方法
7.2.1.清空字典
>>> contacts.clear()
7.2.2.潛復(fù)制字典
- 和list一樣潛復(fù)制這對(duì)二維或以上多維數(shù)據(jù)結(jié)構(gòu)時(shí)贝椿,不是全完數(shù)據(jù)副本的拷貝
>>> copy_contacts = contacts.copy()
>>> contacts['3091'][0] = 'erha'
>>> contacts
{'3951': ['Bruce', 'IT', 'DBA'], '3091': ['erha', 'HR', 'HR'], '5122': ['BlueTShirt', 'Sales', 'SecurityGuard']}
>>> copy_contacts
{'3951': ['Bruce', 'IT', 'DBA'], '3091': ['erha', 'HR', 'HR'], '5122': ['BlueTShirt', 'Sales', 'SecurityGuard']}
- 深度復(fù)制
>>> deepcopy_contacts = copy.deepcopy(contacts)
>>> contacts
{'3951': ['Bruce', 'IT', 'DBA'], '3091': ['erha', 'HR', 'HR'], '5122': ['BlueTShirt', 'Sales', 'SecurityGuard']}
>>> contacts['3091'][0] = 'Jack'
7.2.3.初始化dict
- 和潛復(fù)制一樣都是有二級(jí)結(jié)構(gòu)指針問(wèn)題
>>> dict_module = dict.fromkeys(['BJ','SH','GZ'],['domain',{'module':'example.com'}])
>>> for k in dict_module: #遍歷字典
... print k,dict_module[k]
...
SH ['domain', {'module': 'example.com'}]
GZ ['domain', {'module': 'example.com'}]
BJ ['domain', {'module': 'example.com'}]
7.2.4.獲取dict的value
- 獲取字典中的value,找不到不拋出異常
>>> contacts.get('3951')
['Bruce', 'IT', 'DBA']
>>> contacts.get(3951)
7.2.5.判斷dict中的key是否存在
>>> contacts.has_key(3951)
False
>>> contacts.has_key('3951')
True
7.2.5.將dict轉(zhuǎn)換成list
- 一般用于遍歷字典使用,我們后面介紹語(yǔ)法及效率問(wèn)題
>>> contacts.items()
[('3951', ['Bruce', 'IT', 'DBA']), ('3091', ['Jack', 'HR', 'HR']), ('5122', ['BlueTShirt', 'Sales', 'SecurityGuard'])]
7.2.6.返回字典的所有Key
>>> contacts.keys()
['3951', '3091', '5122']
- 判斷成員是否在字典的key中
>>> '3527' in contacts.keys()
True
7.2.7.返回字典的所有values
>>> contacts.values()
[['Bruce', 'IT', 'DBA'], ['Jack', 'HR', 'HR'], ['BlueTShirt', 'Sales', 'SecurityGuard']]
- 判斷成員是否在字典的value中
>>> test_dict = {'sansha':['erha','samo']}
>>> test_dict.values()
[['erha', 'samo']]
>>> test_dict.values()[0]
['erha', 'samo']
>>> 'erha' in test_dict.values()[0]
True
7.2.8.刪除dict元素
- 刪除dict元素陷谱,并返回刪除的value
>>> contacts.pop('3091')
['Jack', 'HR', 'HR']
7.2.9.隨機(jī)刪除dict元素
>>> contacts.popitem()
('3951', ['Bruce', 'IT', 'DBA'])
7.2.10.添加dict元素
- 添加dict元素烙博,如果不寫value,則為空烟逊;如果存在及不創(chuàng)建
>>> contacts.setdefault('name_module')
>>> contacts.setdefault(3951,['Bruce','IT','DBA'])
['Bruce', 'IT', 'DBA']
7.2.11.合并dict
- 如果key沖突渣窜,則覆蓋原有value
>>> a ={ 1:'a',2:'2', 4:'5'}
>>> b = {1:2,2:3,3:4}
>>> a.update(b)
>>> a
{1: 2, 2: 3, 3: 4, 4: '5'}
7.3.字典的高級(jí)特性
7.3.1.多維字典的應(yīng)用
- 聲明一個(gè)字典
site_catalog = {
"BJ":{
"noodle": ["pretty, good"],
"duck": ["Who eats"," ho regrets"],
"tiananmen": ["many people"],
},
"SH":{
"food":["i do not know","I heard that sweets mainly"]
},
"GZ":{
"vermicelli":["Looking at the scary", "eating is fucking sweet"]
}
}
- 字典的添加
>>> site_catalog['CD'] = {'gril':['White,','rich','beautiful']}
>>> #上下兩種方法都可以.
>>> site_catalog['CD']['boay'] = {}
>>> site_catalog['CD']['boay']['key'] = ['Tall', 'rich and handsome']
>>> site_catalog['BJ']['ditan'] = ['拜地']
- 字典的修改value
注意:dict不能修改字典的key,只能是刪除,在創(chuàng)建
>>> site_catalog['CD']['gril'][0] = 'Bai...'
- 字典的訪問(wèn)
>>> site_catalog['CD']['gril'][0]
'White,'
>>> site_catalog['CD']['gril'].count('White')
0
- 三維字典的訪問(wèn)
>>> for k in site_catalog:
... print "Title:%s" % k
... for v in site_catalog[k]:
... print "-> index:%s" % v
... for j in site_catalog[k][v]:
... if 'key' in site_catalog[k][v]:
... print '--> result:{}'.format(site_catalog[k][v][j])
... continue
... print '--> result:{}'.format(j)
...
Title:SH
-> index:food
--> result:i do not know
--> result:I heard that sweets mainly
Title:GZ
-> index:vermicelli
--> result:Looking at the scary
--> result:eating is fucking sweet
Title:BJ
-> index:tiananmen
--> result:many people
-> index:noodle
--> result:pretty, good
-> index:ditan
--> result:拜地
-> index:duck
--> result:Who eats
--> result: ho regrets
Title:CD
-> index:Gril
--> result:White,
--> result:rich
--> result:beautiful
-> index:boay
--> result:['Tall', 'rich and handsome']
-> index:gril
--> result:Bai...
--> result:rich
--> result:beautiful
7.3.2.遍歷字典比較
7.3.2.1.方法一
- itesm函數(shù)會(huì)將所有dict轉(zhuǎn)換成list宪躯,數(shù)據(jù)量大時(shí)dict轉(zhuǎn)換成list乔宿,效率超級(jí)低下
>>> contacts = {'3527': 'tangYan', '3951': {'Bruce': ['IT', 'DBA']}, '3091': {'Jack': ['HR', 'HR']}, '5122': {'BlueTShirt': ['Sales', 'SecurityGuard']}}
>>> for k, v in contacts.items():
... print k ,v
...
3527 tangYan
3951 {'Bruce': ['IT', 'DBA']}
3091 {'Jack': ['HR', 'HR']}
5122 {'BlueTShirt': ['Sales', 'SecurityGuard']}
7.3.2.2.方法二
- 最簡(jiǎn)單的遍歷字典
>>> for i in contacts:
... print i,contacts[i]
...
3527 tangYan
3951 {'Bruce': ['IT', 'DBA']}
3091 {'Jack': ['HR', 'HR']}
5122 {'BlueTShirt': ['Sales', 'SecurityGuard']}
7.3.2.3.方法三
- 基于dict內(nèi)置方法iteritems()迭代器(iterator)
items()是返回包含dict所有元素的list,但是由于這樣太浪費(fèi)內(nèi)存访雪。性能也是極其的地下详瑞,所以就引入了iteritems(), iterkeys(), itervalues()這一組函數(shù),用于返回一個(gè) iterator 來(lái)節(jié)省內(nèi)存臣缀;但是在 3.x 里items() 本身就返回這樣的 iterator坝橡,所以在 3.x 里items() 的行為和 2.x 的 iteritems() 行為一致,iteritems()這一組函數(shù)就廢除了肝陪〔低ィ”
>>> for i in contacts.iteritems():
... print i
...
('3527', 'tangYan')
('3951', {'Bruce': ['IT', 'DBA']})
('3091', {'Jack': ['HR', 'HR']})
('5122', {'BlueTShirt': ['Sales', 'SecurityGuard']})
- iteritems()
>>> result_iterator = contacts.iteritems()
>>> result_iterator.next()
('3527', 'tangYan')
>>> result_iterator.next()
('3951', {'Bruce': ['IT', 'DBA']})
>>> result_iterator.next()
('3091', {'Jack': ['HR', 'HR']})
>>> result_iterator.next()
('5122', {'BlueTShirt': ['Sales', 'SecurityGuard']})
>>> result_iterator.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
- iterkeys()
>>> '3951' in contacts.iterkeys()
True
- itervalues()
>>> 'tangYan' in contacts.itervalues()
True
7.3.2.4.一致性
雖然Iterator被采納,評(píng)論卻指出氯窍,這種說(shuō)法并不準(zhǔn)確饲常,在 3.x 里 items() 的行為和 2.x 的 iteritems() 不一樣,它實(shí)際上返回的是一個(gè)"full sequence-protocol object"狼讨,這個(gè)對(duì)象能夠反映出 dict 的變化贝淤,后來(lái)在 Python 2.7 里面也加入了另外一個(gè)函數(shù) viewitems() 和 3.x 的這種行為保持一致
創(chuàng)建一個(gè)測(cè)試dict
>>> d = {'size': 'large', 'quantity': 6}
>>> il = d.items()
>>> it = d.iteritems()
>>> vi = d.viewitems()
- 模擬字典被正常修改
d['newkey'] = 'newvalue'
- 驗(yàn)證一下不同方式dict的結(jié)果
- 原生字典
>>> for i in d:
... print i, d[i]
...
newkey newvalue
quantity 6
size large
- items()字典
>>> for k, v in il:
... print k, v
...
quantity 6
size large
- iteritems()字典
>>> for k, v in it:
... print k, v
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
- viewitmes()字典
>>> for k, v in vi:
... print k, v
...
newkey newvalue
quantity 6
size large
總結(jié):在 2.x 里面,最初是 items() 這個(gè)方法政供,但是由于太浪費(fèi)內(nèi)存播聪,所以加入了 iteritems() 方法朽基,用于返回一個(gè) iterator,在 3.x 里面將 items() 的行為修改成返回一個(gè) view object离陶,讓它返回的對(duì)象同樣也可以反映出原 dictionary 的變化稼虎,同時(shí)在 2.7 里面又加入了 viewitems() 向下兼容這個(gè)特性。
所以在 3.x 里面不需要再去糾結(jié)于三者的不同之處招刨,因?yàn)橹槐A袅艘粋€(gè) items() 方法霎俩。
8.集合操作
在Python中set是基本數(shù)據(jù)類型的一種集合類型,是一個(gè)無(wú)序不重復(fù)元素集, 基本功能包括關(guān)系測(cè)試和消除重復(fù)元素. 集合對(duì)象還支持union(聯(lián)合), intersection(交), difference(差)和sysmmetric difference(對(duì)稱差集)等數(shù)學(xué)運(yùn)算沉眶;它有可變集合(set())和不可變集合(frozenset)兩種打却。
8.1.集合基本操作
8.1.1.聲明集合
>>> a = set(range(1,6))
>>> b = set(range(5,10))
>>> a
set([1, 2, 3, 4, 5])
>>> b
set([8, 9, 5, 6, 7])
8.1.2.交集
>>> a & b
set([5])
或
>>> a.intersection(b)
set([5])
8.1.3.并集
>>> a | b
set([1, 2, 3, 4, 5, 6, 7, 8, 9])
或
>>> a.union(b)
set([1, 2, 3, 4, 5, 6, 7, 8, 9])
8.1.4.差集
>>> a - b
set([1, 2, 3, 4])
>>> b - a
set([8, 9, 6, 7])
或
>>> a.difference(b)
set([1, 2, 3, 4])
>>> b.difference(a)
set([8, 9, 6, 7])
8.1.5.對(duì)稱差集
- 取兩個(gè)集合中互相沒(méi)有的元素
>>> a ^ b
set([1, 2, 3, 4, 6, 7, 8, 9])
或
>>> a.symmetric_difference(b)
set([1, 2, 3, 4, 6, 7, 8, 9])
8.1.6.子集
- D是C的子集
>>> c = set([1,2,3,4,5,6,7])
>>> d = set([1,3,7])
>>> d <= c
True
或
>>> d.issubset(c)
True
8.1.7.父集
- C是D的父集
>>> c >= d
True
或
>>> c.issuperset(d)
True
8.1.8.成員測(cè)試
- 成員1在集合A的元素?
>>> 1 in a
True
- 成員1不在集合A的元素?
>>> 1 not in a
False
8.2.集合內(nèi)置函數(shù)
8.2.1.添加一個(gè)元素
>>> a.add('haha')
8.2.2.清空集合A
>>> a.clear()
>>> print a
set([])
8.2.3.淺復(fù)制
- 老問(wèn)題,呵呵不說(shuō)了谎倔。
>>> a = set(range(1,6))
>>> e = a.copy()
8.2.4.隨機(jī)刪除元素
- 隨機(jī)刪除集合中的元素柳击,并顯示被刪除的元素
>>> a.pop()
1
8.2.5.刪除元素
>>> a.remove(2)
8.2.6.合并集合
- 此時(shí)就能看出來(lái)集合的特性:去重功能
>>> a = set(range(1,6))
>>> b = set(range(3,8))
>>> a
set([1, 2, 3, 4, 5])
>>> b
set([3, 4, 5, 6, 7])
>>> a.update(b)
>>> a
set([1, 2, 3, 4, 5, 6, 7])
- 合并list測(cè)試
>>> a.update([5,6,7,8])
>>> a
set([1, 2, 3, 4, 5, 6, 7, 8])
9.作業(yè)
9.1.猜年齡作業(yè)
- 輸入用戶的信息
- 并且只有猜對(duì)年齡才能顯示
- 要求猜的機(jī)會(huì)只有10次
# !/bin/env python
# _*_ coding:utf-8 _*_
name = raw_input('Please imput your name:')
job = raw_input('job:')
salary = raw_input('salary:')
for i in range(10):
age = input('age:')
if age > 29:
print 'think smaller!'
elif age == 29:
print '\033[32;1mGOOD! 10 RMB!\033[0m'
break
else:
print 'think bigger!'
print 'You still got %s shots !' % (9 - i)
print '''
Personal information of %s:
Name: %s
Age : %d
Job : %s
salary : %s
''' % (name,name,age,job,salary)
9.2.用戶交互作業(yè)
- 用戶指定打印循環(huán)的次數(shù)
- 達(dá)到循環(huán)的次數(shù)是問(wèn)用戶是否繼續(xù)
- 根據(jù)用戶選擇退出還是再次執(zhí)行打印的循環(huán)次數(shù)
# !/bin/env python
# _*_ coding:utf-8 _*_
print_num = input('Which loop do you want it to be printed out?')
counter = 0
while True:
print 'Loop:', counter
if counter == print_num:
choice = raw_input('Do you want to continue the loop?(y/n)')
if choice == 'y' or choice == 'Y':
while print_num <= counter:
print_num = input('Which loop do you want it to be printed out?')
if print_num <= counter:
print '輸入值不得小于循環(huán)體的值'
elif choice == 'n' or choice == 'N':
print'exit loop....'
break
else:
print 'invalid input!'
continue
counter += 1
以上代碼能夠完成基本功能但是還有bug的地方
- 在執(zhí)行choice 代碼塊時(shí),用戶輸入,會(huì)有多余的loop打印
Do you want to continue the loop?(y/n)12
invalid input!
Loop: 5
- 代碼有重復(fù)代碼片习,這肯定是可以優(yōu)化的兩個(gè)print_num用戶輸入
print_num = input('Which loop do you want it to be printed out?')
優(yōu)化版
# !/bin/env python
# _*_ coding:utf-8 _*_
counter = 0
flag_1 = True
flag_2 = True
while True:
if flag_1 is True:
print 'Loop:', counter
else:
flag_1 = True
if flag_2 is True:
print_num = input('Which loop do you want it to be printed out?')
flag_2 = False
if counter == print_num:
choice = raw_input('Do you want to continue the loop?(y/n)')
if choice == 'y' or choice == 'Y':
while print_num <= counter:
print_num = input('Which loop do you want it to be printed out?')
if print_num <= counter:
print '輸入值不得小于循環(huán)體的值'
elif choice == 'n' or choice == 'N':
print'exit loop....'
break
else:
print 'invalid input!'
flag_1 = False
continue
counter += 1
9.3.購(gòu)物車作業(yè)
- 輸入你的工資捌肴,進(jìn)入商城選購(gòu)商品
- 將商品放入購(gòu)物車后,相應(yīng)扣款
- 結(jié)束購(gòu)物車時(shí)毯侦,清算商品及金額
- 并打印買的商品信息
#!/bin/env python
# _*_ coding:utf-8 _*_
products = [['Iphone',5800],['MacPro',12000],['NB Shoes',680],['MX4',64]]
salary = raw_input('Please input your salary: ')
shopping_list = []
if salary.isdigit():
salary = int(salary)
while True:
# print shoppint cart
for index,item in enumerate(products):
#print products.index(i),i
print index, item
# get user input
choice = raw_input('Please choose sth to buy')
# judge user input data type is number
if choice.isdigit():
choice = int(choice)
# judge goods count and seach goods index
if choice < len(products) and choice >= 0 :
pro_itmes = products[choice]
# judge Wage salary
if salary > pro_itmes[1] :
shopping_list.append(pro_itmes)
salary = salary - pro_itmes[1]
print('Added \033[31;1m%s\033[1m into shopping cart ,your current balance : %s' % (pro_itmes,salary))
else:
print('Sorry, your credit is running low : \033[41;1m%s\033[1m' % salary)
else:
print('input invalied!')
elif choice == 'q':
print("""------ shopping Cart------""")
for i in shopping_list:
print i
print('wage balance : \033[31;1m%s\033[1m ' % salary)
exit()
else:
print('There is no such commodity!')
else:
print('input error!')
9.4.地區(qū)查詢作業(yè)
- 打印省哭靖、市具垫、縣侈离、區(qū)、街道信息
- 可返回上一級(jí)
- 可以隨時(shí)退出程序筝蚕,以下是所需dict:
menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'網(wǎng)易':{},
'google':{}
},
'中關(guān)村':{
'愛(ài)奇藝':{},
'汽車之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'鏈家':{},
'小販':{},
},
'天通苑':{},
'回龍觀':{},
},
'朝陽(yáng)':{},
'東城':{},
},
'上海':{
'閔行':{
"人民廣場(chǎng)":{
'炸雞店':{}
}
},
'閘北':{
'火車戰(zhàn)':{
'攜程':{}
}
},
'浦東':{},
},
'山東':{},
}
exit_code = False
while not exit_code:
for i in menu:
print i
choire = raw_input('Please input city :')
if choire in menu:
while not exit_code:
for i2 in menu[choire]:
print i2
choire2 = raw_input('Please input area or cd .. (Y/N):')
if choire2 in menu[choire]:
if len(menu[choire][choire2]) <= 0 :
print "沒(méi)有信息!"
while not exit_code:
for i3 in menu[choire][choire2]:
print i3
choire3 = raw_input('Please input space or cd .. (Y/N):')
if choire3 in menu[choire][choire2]:
for i4 in menu[choire][choire2][choire3]:
print i4
choire4 = raw_input('cd .. (Y/N)')
if choire4 == 'Y':
pass
elif choire4 == 'q':
exit_code = True
if choire3 == 'Y':
break
elif choire3 == 'q':
exit_code = True
if choire2 == 'Y':
break
elif choire2 == 'q':
exit_code = True
- 附錄
- 運(yùn)算符
- 條件語(yǔ)句
- 循環(huán)運(yùn)算
- 字符串操作
- 列表操作
- 元組操作
- 字典操作
- 集合操作
- 作業(yè)