函數(shù)
我們可以把程序中相對(duì)獨(dú)立的功能模塊抽取出來(lái)這樣做的好處一是減少重復(fù)代碼的編寫
二是將來(lái)可以重復(fù)的使用這些功能模塊python中的函數(shù)就是代表了這樣的功能模塊
y = f(x) f 是函數(shù)名 x 是自變量 y 是因變量
注意
如果定義的函數(shù)名重復(fù)了筋蓖,則后面定義的函數(shù)將更新前面定義的函數(shù)
A and B 如果A False背亥,B被短路绝页,B不被執(zhí)行
A or B 如果A True土浸,B被短路浓恳,B不被執(zhí)行
所以A 和 B 位置的不同可能會(huì)對(duì)執(zhí)行效率產(chǎn)生明顯影響一個(gè)文件就是一個(gè)模塊,千萬(wàn)不要在一個(gè)模塊中有定義很多功能的函數(shù)绎速,盡量保證模塊功能的單一性
作用域 - LEGB 盡量減少全局變量的使用
在定義的函數(shù)中不能用print(),用了就表面你的函數(shù)只能在命令提示行里面執(zhí)行亩钟,不能在窗口中執(zhí)行(在做項(xiàng)目時(shí)堅(jiān)決執(zhí)行)
print('%02d ' % val, end='') # 把val格式化成兩位輸出
from combination import * # 導(dǎo)入combination中所有模塊 from combination as com # 將combination 重命名為com from math import gcd # 系統(tǒng)將用下面combination中后導(dǎo)入的gcd函數(shù) from combination import is_prime, gcd, lcm, add,is_palindrome # 調(diào)用函數(shù)時(shí)若出現(xiàn)重復(fù)绢涡,則自動(dòng)取后調(diào)入的函數(shù) # 如果想兩個(gè)函數(shù)同時(shí)存在牲剃,則不用from導(dǎo)入 # 直接import combination 和 import math # 然后用combination.gcd 和 math.gcd
可變參數(shù)的函數(shù)
def f(*args):
total = 0
for val in args:
total += val
return total
# 定義了一個(gè)可變參數(shù)的函數(shù),如果想傳入一個(gè)列表的每個(gè)元素雄可,則在列表名前加上*
mylist = [1, 3, 5, 10, 20]
print(f(*mylist))
作用域
python 搜索一個(gè)變量的方式是從局部作用域到嵌套作用域再到全局作用域
local - Enclosed - Global
LEGB
如果想改變搜索范圍 可以使用global和 nonloal關(guān)鍵字
在實(shí)際編程中一定不要隨便使用全局變量
# 在函數(shù)外面定義的 a 是一個(gè)全局變量
# global variable
a = 100
def foo():
# local variable
# 函數(shù)內(nèi)的局部變量 離開(kāi)foo函數(shù) a 是無(wú)法訪問(wèn)的
a = 200
print(a)
foo()
print(a)
# 在函數(shù)外面定義的 a 是一個(gè)全局變量
# global variable
a = 100
b = 'good'
def foo():
b = 'hello'
def bar():
b = 'shit'
print(a)
print(b)
bar()
foo()
print(a)
# 在函數(shù)外面定義的 a 是一個(gè)全局變量
# global variable
a = 100
def foo():
global a
a = 200
b = 'hello'
def bar():
global b
b = 'good'
print(a)
print(b)
bar()
print(b)
foo()
print(a)
# 在函數(shù)外面定義的 a 是一個(gè)全局變量
# global variable
a = 100
def foo():
global a
a = 200
b = 'hello'
def bar():
nonlocal b
b = 'good'
print(a)
print(b)
bar()
print(b)
foo()
print(a)
各種函數(shù)實(shí)例
求階乘
# 定義求階乘的函數(shù) 將求階乘的功能抽取出來(lái)放到函數(shù)中
def f(x):
y = 1
for z in range(1, x + 1):
y *= z
return y
if __name__ == '__main__':
m = int(input('m = '))
n = int(input('n = '))
# 當(dāng)需要計(jì)算階乘的時(shí)候不用再寫循環(huán)而是直接調(diào)用已經(jīng)定義好的函數(shù)
# 求C(m,n)
print(f(m) // f(n) // f(m - n))
求階乘2
# 階乘
def foo(n):
if n==0:
sun = 1
else:
sun = n * foo(n-1)
return sun
求最大公約數(shù)和最小公倍數(shù)
# 如果定義的函數(shù)名重復(fù)了凿傅,則后面定義的函數(shù)將更新前面定義的函數(shù)
from math import sqrt
# 谷歌的文檔注釋方法
def gcd(x, y):
"""
計(jì)算最大公約數(shù)
parameters:
x 一個(gè)非負(fù)整數(shù)
y 一個(gè)非負(fù)整數(shù)
Returns:
x, y 的最大公約數(shù)
"""
(x, y) =(y, x) if x > y else (x, y)
for factor in range(x, 0, -1):
if x % factor == 0 and y % factor == 0:
return factor
# 文檔注釋
def lcm(x, y):
"""
計(jì)算最小公倍數(shù)
:param x:非負(fù)整數(shù)
:param y:非負(fù)整數(shù)
:return:最小公倍數(shù)
"""
return x * y //gcd(x, y)
短除法求最大公約數(shù)
# 最大公約數(shù)(短除法)
def bar1(x,y):
if x > y:
return bar1(y, x)
elif y % x == 0:
return x
else:
return bar1(y % x, x)
計(jì)算臺(tái)階走法
# 有10步臺(tái)階,一個(gè)小孩每次可以選擇一次走1步数苫、2步聪舒、3步,問(wèn)走完這個(gè)臺(tái)階有幾種方法
def bar2(n):
if n < 0:
return 0
elif n == 0:
return 1
else:
return bar2(n - 1) + bar2(n - 2) + bar2(n - 3)
判斷素?cái)?shù)
# 官方的文檔注釋方法
def is_prime(num):
"""
判斷素?cái)?shù)
:param num: 非負(fù)整數(shù)
:return: 是素?cái)?shù)就返回True 否則 返回False
"""
for j in range(2, int(sqrt(num)) + 1):
if num % j == 0:
return False
return True if num != 1 else False
判斷一個(gè)數(shù)是不是回文數(shù)
def is_palindrome(num):
"""
判斷一個(gè)數(shù)是不是回文數(shù)
:param num: 一個(gè)非負(fù)整數(shù)
:return:是回文數(shù)返回True否則返回False
"""
temp = num
total = 0
while temp > 0:
total = total * 10 + temp % 10
temp //= 10
return num == total
拿21根火柴
21跟火柴虐急,人先拿箱残,拿計(jì)算機(jī)后,最少1根止吁,最多4根被辑,誰(shuí)拿到最后一根就算輸保證計(jì)算機(jī)獲勝
from random import randint
def is_macth():
"""
判斷誰(shuí)拿最后一根火柴
:return: 返回結(jié)果
"""
total = 21
while total > 0:
print('總共還有%d根火柴' % total)
while True:
peopel = eval(input('請(qǐng)輸入你拿的根數(shù)'))
if 0 < peopel <= 4 and peopel <= total:
break
total -= 5
if total > 0:
print('電腦拿走了%d根火柴' % (5 - peopel))
print('你拿走了最后一根,你輸了')
判斷回文字符串
def is_pa(my_str):
"""
判斷回文字符串
:param my_str: 輸入的字符串
:return: 是回文字符串返回True敬惦,不是返回Fals
"""
temp = ''
my_str1 = my_str
for _ in range(len(my_str)):
temp += my_str1[-1]
my_str1 = my_str1[:-1]
if temp == my_str:
return True
else:
return False
字符串
字符串常用功能
字符串的所有功能都不直接更改原字符串盼理,而是產(chǎn)生了一個(gè)新的字符串賦值給你
help(''.find)
# 不變字符串 相當(dāng)于str1一直不變,變的是新字符串
str1 = 'hello, world!'
print(len(str1)) # 返回長(zhǎng)度
print(str1.capitalize()) # 首字母大寫
print(str1.upper()) # 全大寫
print(str1)
print(str1.find('or')) # 查找并返回下標(biāo)
print(str1.find('shit')) #查不到返回-1
print(str1.startswith('He')) # 看是不是He開(kāi)頭
print(str1.startswith('he')) # 看是不是he開(kāi)頭
print(str1.endswith('!')) # 看結(jié)尾是不是!
print(str1.center(50, '*')) # 居中 并用*填滿50個(gè)字符
print(str1.rjust(50, '#')) # 居左 并用#填滿50個(gè)字符
# print(str1.index('or')) # 查找并返回下標(biāo)
# print(str1.index('shit')) #查不到直接報(bào)錯(cuò)
str2 = 'abc123456'
print(str2[2]) # 取出c
print(str2[2:5]) # 取出 c12 第五個(gè)取不到
print(str2[-3:-1]) # 取出 45
print(str2[-1:-3:-1]) # 取出 45
print(str2[:]) # 全取
print(str2[:2]) # 取出ab
print(str2[5:]) # 取出3456
print(str2[::2]) # 隔一個(gè)取一個(gè)
print(str2[::-1]) # 字符串的倒轉(zhuǎn)
print(str2.isdigit()) # 判斷是不是全數(shù)字
print(str2.isalpha()) # 判斷是不是全字母
print(str2.isalnum()) # 判斷只有數(shù)字和字母
str3 = ' 644148993@qq.com '
print(str3.rstrip()) # 自動(dòng)取消右邊空格
print(str3.strip()) #自動(dòng)取消左右兩邊空格
字符串的實(shí)例
制作文字跑馬燈效果
# 文字跑馬燈效果
def light():
contain = input('請(qǐng)輸入跑馬燈文字:')
while True:
os.system('cls')
print(contain)
time.sleep(0.5)
contain = contain[1:] + contain[0]
取文件名的后綴名
# 考慮到文件名有 .abc vbg. fig.gei.exe hosts 等情況 還考慮到要不要點(diǎn):默認(rèn)不要has_dot=False
def get_suffix(filename, has_dot=False):
"""
獲取文件名的后綴名
:param filename: 文件名
:param has_dot: 是否要點(diǎn)(.)
:return: 后綴名
"""
pos = filename.rfind('.')
if 0 < pos < len(filename)-1:
index = pos if has_dot else pos + 1
return filename[index:]
else:
return ''
生成制定長(zhǎng)度的隨機(jī)驗(yàn)證碼
def generate_code(code_len=4):
'''
生成由大小字母數(shù)字長(zhǎng)度確定的隨機(jī)驗(yàn)證碼
:param code_len: 驗(yàn)證碼長(zhǎng)度
:return: 由大小字母數(shù)字組成的驗(yàn)證碼
'''
all_char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
last_pos = len(all_char) - 1
code = ''
for _ in range(code_len):
index = randint(0, last_pos)
code += all_char[index]
return code
統(tǒng)計(jì)擲x個(gè)色子y次后各個(gè)點(diǎn)數(shù)出現(xiàn)的次數(shù)
# 擲n個(gè)色子一次后擲出來(lái)的點(diǎn)數(shù)
def bar(n):
"""
計(jì)算n個(gè)色子搖一次的點(diǎn)數(shù)和
:param n:色子個(gè)數(shù)
:return:n個(gè)色子搖一次的點(diǎn)數(shù)和
"""
return 0 if n <= 0 else randint(1, 6) + bar(n - 1)
# 有了列表(容器)我們可以使用1個(gè)變量來(lái)保存多個(gè)數(shù)據(jù)
# 更為重要的是我們可以使用循環(huán)對(duì)列表中保存的數(shù)據(jù)進(jìn)行操作
def dot(x, y):
"""
計(jì)算x個(gè)色子擲y次后每個(gè)點(diǎn)數(shù)出現(xiàn)的次數(shù)
:param x: 色子個(gè)數(shù)
:param y: 擲色子次數(shù)
:return: 利用列表返回每個(gè)點(diǎn)數(shù)出現(xiàn)的次數(shù)
"""
f = [0] * (6 * x - (x - 1))
for _ in range(y):
face = bar(x)
f[face - x] += 1
return f
列表
列表的加法
mylist = [x ** 2 for x in range(1, 10)]
mylist = mylist + [20, 30] # 列表的加法是添加元素
print(mylist)
列表的各種常用方法
# 列表
f = [10, 20, 30, 20, 40, 20, 50]
f1 = ['odlh', 'akdgah', 'idhgjfhgahjghaj', 'ddhgjhhgghh']
# CRUD Create Read Update Delete
'''
f.append() # 追加 加到最后
f.insert() # 插入 需要選擇加入的位置(用一定的容錯(cuò)性)
f.clear() # 清空
f.remove() # 移除一個(gè)數(shù)有勾,如果有多個(gè)相同元素,則刪除開(kāi)頭那個(gè)
del f[6] # 刪除50
print(f.index(40, 2, 5)) # 在2-5里面查找40,并返回索引
f.pop(1) # 刪除索引為1的元素捕仔,默認(rèn)為刪除末尾元素
f.reverse() # 翻轉(zhuǎn)f
enumerate(f) # 枚舉 并返回索引
f2 = sorted(f1, key=len, reverse=True) # 對(duì)f1按照字符串長(zhǎng)度排序,并且為倒序
'''
列表的生成方式
import sys
# 在計(jì)算機(jī)系統(tǒng)里面:
# 時(shí)間和空間是不可調(diào)和的矛盾
# 軟件和硬件在邏輯上是等效的
def main():
f = list(range(10)) # 用list 構(gòu)造器構(gòu)造一個(gè)列表 (最不常用)
print(f)
g = [x ** x for x in range(1, 10)]
# 用列表的生成表達(dá)式語(yǔ)法創(chuàng)建列表容器 (生成式)
# 用這種語(yǔ)法創(chuàng)建列表之后元素已經(jīng)準(zhǔn)備就緒呆细,所以需要較多的內(nèi)尺空間
print(g)
h = [x ** 2 for x in range(1, 100)]
print(h)
print(sys.getsizeof(h))
k = (x ** 2 for x in range(1, 100))
# (生成器)--->除了把[]改成()棒坏,還可以把定義函數(shù)的 return 改成 yield
# 列表生成器 這里得到的不是一個(gè)列表 而是一個(gè)生成器對(duì)象 (生成器)
# 通過(guò)生成器可以獲取到數(shù)據(jù) 它不占用額外的空間存儲(chǔ)數(shù)據(jù)
# 每次需要數(shù)據(jù)的時(shí)候就通過(guò)生成器取數(shù)據(jù) 當(dāng)然這需要花費(fèi)時(shí)間
print(k)
print(sys.getsizeof(k)) #(計(jì)算k占用的內(nèi)尺)
for val in k:
print(val, end='\t')
print()
d = [x + y for x in 'ABCD' for y in '1234']
print(d)
列表相關(guān)實(shí)例
Fibonacci序列
# fibonacci 序列
# [1, 1, 2, 3, 5, 8, 13, ... ]
a = []
for i in range(20):
if i >=2:
a.append(a[i-1] + a[i-2])
else:
a.append(1)
print(a)
print(a[18]/a[19]) # 黃金分割
print(a[::-1]) # 切片
print(a) # a 被操作后沒(méi)有改變
a.reverse() # 翻轉(zhuǎn)a
print(a) # a.reverse() 直接把a(bǔ)改變了
# 生成器方法
def fib(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
yield a
for val in fib(20):
print(val)
方法和函數(shù)
def main():
f = ['orange', 'apple', 'banna', 'cake']
# python 內(nèi)置的排序方法默認(rèn)都是升序(從小到大)
# 如果希望排序成降序(從大到小)可以通過(guò)reverse參數(shù)來(lái)控制
# python 中的函數(shù)幾乎都是沒(méi)有副作用的函數(shù)
# 調(diào)用函數(shù)后不會(huì)影響傳入的參數(shù)
f2 = sorted(f, reverse=True) # 函數(shù)
print(f)
print(f2)
f.sort(reverse=True) # 方法
print(f)
f.reverse() # 方法
print(f)
f3 = list(reversed(f)) # 函數(shù) reversed(f)返回的是一個(gè)反轉(zhuǎn)迭代器潜叛,需要加lise才能看到反轉(zhuǎn)的列表
print(f3)
計(jì)算最大值最小值和平均數(shù)
def my_math():
"""
計(jì)算一個(gè)列表的最大值最小值和平均數(shù)
:return: 計(jì)算一個(gè)列表的最大值最小值和平均數(shù)
"""
scores = [80, 59, 38, 99, 78]
maxscore = minscore = scores[0]
total = 0
for score in scores:
if score > maxscore:
maxscore = score
elif score < minscore:
minscore = score
total += score
print('最小值為%d秽褒,最大值為%d壶硅,平均值為%.1f' % (minscore, maxscore, total/len(scores)))
按照字符串長(zhǎng)度排序
def bar():
"""
按照字符串長(zhǎng)度排序
:return: 從長(zhǎng)到短排序
"""
o = ['odlh', 'akdgah', 'idhgjfhgahjghaj', 'ddhgjhhgghh']
f2 = sorted(o, key=len, reverse=True)
print(f2)
隨機(jī)返回幾組雙色球號(hào)碼
def random_select():
"""
隨機(jī)返回一組彩票(雙色球)
:return: 返回一組雙色球號(hào)碼
"""
red_balls = list(range(1, 34))
selected_balls = []
for _ in range(6):
index = randrange(len(red_balls))
selected_balls.append(red_balls[index])
del red_balls[index]
selected_balls.sort()
selected_balls.append(randint(1, 16))
return selected_balls
def display(ball):
"""
在藍(lán)色前面加上|,并在一位數(shù)前補(bǔ)上0
:param ball: 含一組彩票號(hào)碼的列表容器
:return: 在藍(lán)色前面加上|销斟,并在一位數(shù)前補(bǔ)上0
"""
for index, val in enumerate(ball): # enumerate() 枚舉 并返回索引
if index == len(ball) - 1:
print('| ', end='')
print('%02d ' % val, end='')
print()
def cycle():
"""
返回你需要注數(shù)的雙色球號(hào)碼
:return: 返回你需要注數(shù)的雙色球號(hào)碼
"""
n = int(input('給我搖幾注:'))
for _ in range(n):
display(random_select())
求次大
# 求次大
def next_max(all_data):
max_one = max_two = all_data[0]
for value in all_data:
if value > max_one:
max_two = max_one
max_one = value
elif max_two < value < max_one:
max_two = value
return max_two
約瑟夫環(huán)問(wèn)題
# 約瑟夫環(huán)問(wèn)題:有15個(gè)基督教徒和15個(gè)非基督教徒坐船去旅游庐椒,船壞了,要?dú)⒌?5個(gè)人其他人才能獲救
# 他們決定隨機(jī)從一個(gè)人報(bào)數(shù)蚂踊,數(shù)到9的就被殺死约谈,結(jié)果15個(gè)基督教徒都活下來(lái)了,問(wèn)他們是怎么站的犁钟?
def die():
people = [True] * 30
counter = 0
index = 0
number = 0
while counter < 15:
if people[index]:
number += 1
if number == 9:
people[index] = False
counter += 1
number = 0
index += 1
index %= 30
for person in people:
print('基' if person else '非', end='')
求去除最高分和最低分后的平均數(shù)
# 設(shè)計(jì)一個(gè)函數(shù)棱诱,去掉一個(gè)最高分和一個(gè)最低分后求平均數(shù)
def arv(list):
total = 0
max_value = min_value = list[0]
for select in list:
if select > max_value:
max_value = select
elif select < min_value:
min_value = select
list.remove(min_value)
list.remove(max_value)
for now_value in list:
total += now_value
return total/len(list)
返回最大分?jǐn)?shù)及名字
# 原來(lái)有一個(gè)列表,裝的是一組學(xué)生的名字涝动,現(xiàn)在輸入對(duì)應(yīng)學(xué)生的成績(jī)迈勋,找出最高分和最低分和對(duì)應(yīng)的學(xué)生名字
def match(list1):
list2 = []
for name in list1:
score = eval(input('請(qǐng)輸入%s的成績(jī):' % name))
list2.append(score)
max_score = max(list2)
min_score = min(list2)
my_max, my_min = list2.index(max_score), list2.index(min_score)
return '%s擁有最高分%d;%s擁有最低分%d' % (list1[my_max], list2[my_max], list1[my_min], list2[my_min], )
python 的坑
# python 的坑 如果靜態(tài)區(qū)有緩存的數(shù)字醋粟,調(diào)用的時(shí)候都是引用的靜態(tài)區(qū)的值靡菇,不是重新創(chuàng)建的對(duì)象
# 在交互式環(huán)境中,靜態(tài)區(qū)自動(dòng)緩存 -5----256
# 在非交互式環(huán)境中米愿,靜態(tài)區(qū)自動(dòng)緩存所有正數(shù)
def main2():
a = 123
b = 123
print(id(a))
print(id(b))
print(a is b) # True
a = -123
b = -123
print(id(a))
print(id(b))
print(a is b) # False
內(nèi)存管理
棧(stack) 堆(heap) 靜態(tài)區(qū)(數(shù)據(jù)段镰官,只讀數(shù)據(jù)段,代碼段)
變量--對(duì)象的引用--對(duì)象的內(nèi)存地址 -- 棧
對(duì)象--堆--獲取更大的存儲(chǔ)空間
-
id()函數(shù) 和 is運(yùn)算符 -- 驗(yàn)身份
import sys def main1(): # 棧(stack) 堆(heap) 靜態(tài)區(qū)(數(shù)據(jù)段吗货,只讀數(shù)據(jù)段泳唠,代碼段) # 變量--對(duì)象的引用--對(duì)象的內(nèi)存地址 -- 棧 # 對(duì)象--堆--獲取更大的存儲(chǔ)空間 # id()函數(shù) 和 is運(yùn)算符 -- 驗(yàn)身份 list1 = [x for x in range(1,10)] # list1 一個(gè)對(duì)象的地址 list2 = list1 # list1把對(duì)象的地址賦值給list2 list2[0] = 1000 # list1 和 list2 是同一個(gè)列表容器 print(list1) # [1000, 2, 3, 4, 5, 6, 7, 8, 9] list3 = list1[:] # 只有用切片的方法賦值list3一個(gè)新的列表容器 list3[1] = 1000 print(list2) # [1000, 2, 3, 4, 5, 6, 7, 8, 9] print(list3) # [1000, 1000, 3, 4, 5, 6, 7, 8, 9] # 可以查看地址,看是不是同一對(duì)象 print(id(list1)) print(id(list2)) print(id(list3)) print(sys.getrefcount(list)) # 得到list引用次數(shù)
元組 集合 字典
元組內(nèi)的單個(gè)項(xiàng)目不能重新賦值宙搬,且同元素的元組創(chuàng)建時(shí)間比列表快很多(%timeit)笨腥,且同元素的元組占用內(nèi)存空間比列表少很多(getsizeof(a))
集合部分功能
def main():
list1 = [1, 1, 2, 2, 3, 3]
print(list1)
tuple1 = (1, 1, 2, 2, 3, 3)
print(tuple1)
set1 = {1, 1, 2, 2, 3, 3}
print(set1)
set2 = {1, 3, 5, 7, 9}
set3 = set1.intersection(set2) # 集合的交集 set3 = set1 & set2
print(set3)
set3 = set1.union(set2) # 集合的并集 set3 = set1 | set2
print(set3)
set3 = set1.difference(set2) # 集合的差集 set3 = set1 - set2
print(set3)
set3 = set2.difference(set1)
print(set3)
set3 = set1.symmetric_difference(set2) # 集合的對(duì)稱差 set3 = set1 ^ set2
for val in set2:
print(val)
# print(set2[0]) # 集合是無(wú)須存儲(chǔ)的 沒(méi)有下標(biāo) 集合也沒(méi)有重復(fù)元素(去重)
print(set2.pop()) # pop() 集合pop出來(lái)的值是隨機(jī)的
if 3 in set2:
set2.remove(3)
print(set2)
print(set2.issubset(set1)) # 子集 set2 <= set1
print(set2.issuperset(set1)) # 超集 set2 >= set1
set4 = {1, 2}
print(set1.issuperset(set4))
集合 列表 元組 相互的轉(zhuǎn)換
def main():
set1 = {'hello', 'good', 'cfx', 'hello'}
print(len(set1)) # 3
x = sorted(set1)
print(type(x)) # <class 'list'>
print(x) # ['cfx', 'good', 'hello']
list1 = list(set1)
print(list1) # ['good', 'hello', 'cfx']
list2 = [1, 2, 3, 1, 2, 4]
set2 = set(list2)
print(set2) # {1, 2, 3, 4}
tuple1 = (1, 1, 2, 3, 4, 4)
list3 = list(tuple1)
print(list3) # [1, 1, 2, 3, 4, 4]
字典的部分功能
def main():
dict1 = {'name': 'cfx', 'age': '24', 'gender': '男'}
print(dict1['name']) # cfx
print(dict1['age']) # 24
print(dict1['gender']) # 男
dict1['name'] = '王大錘'
# dict1 += {'tel': '13594793585'} 這個(gè)功能不行
dict1.update(height=172, fav=['吃', '喝'])
print(dict1.pop('age')) # 24
print(dict1.popitem()) # ('fav', ['吃', '喝'])
# del dict1 # del減少對(duì)象的引用 斷開(kāi)dict1的引用
del dict1['gender']
print(dict1) # {'name': '王大錘', 'height': 172}
for x in dict1:
print(x, '---->',dict1[x]) # key --value
dict1.setdefault('motto', '成年人的故事太動(dòng)聽(tīng)')
print(dict1['motto']) # 成年人的故事太動(dòng)聽(tīng)
del dict1['motoo']
print(dict1['motto']) # 為空
dict1.pop('motto')
元組 字典 集合的實(shí)例
二維數(shù)列的應(yīng)用
def main():
names = ['關(guān)羽', '張飛', '趙云', '劉備', '孫權(quán)']
subjects = ['語(yǔ)文', '數(shù)學(xué)', 'python']
scores = [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
# scores = [[0, 0, 0] for _ in range(5)]
# scores = [[0] * len(subjects) for _ in range(5)]
# scores = [[0 for __ in range(3)] for _ in range(5)]
'''
# scores1 = [[0] * len(subjects)] * len(names)
# print(id(scores1[0])
# print(id(scores1[1])
# print(id(scores1[2]) # 都是一個(gè)地址,后面乘的5 只是引用了地址5次
# print(scores)
'''
for row,name in enumerate(names):
for col,subject in enumerate(subjects):
scores[row][col] = eval(input('請(qǐng)輸入%s的%s成績(jī):' % (names[row], subjects[col])))
print(scores)
輸入年月日判斷是當(dāng)年的第幾天
def is_leap(year):
"""
判斷是不是閏年
:param year: 輸入年份
:return: 是閏年返回True勇垛,平年返回False
"""
return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
def witch_day(year, month, date):
"""
判斷當(dāng)天是當(dāng)年的第幾天
:param year:輸入的年
:param month:輸入的月
:param date:輸入的日
:return:返回天數(shù)
"""
leap = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
][is_leap(year)]
# is_leap(year) 返回True時(shí)自動(dòng)取1 返回False時(shí)自動(dòng)取0.
total = 0
for index in range(month - 1):
total += leap[index]
return total + date
if __name__ == '__main__':
print(witch_day(2018, 1, 1)) #1
print(witch_day(2016, 3, 1)) # 61
print(witch_day(1980, 11, 28)) # 333
print(witch_day(1981, 12, 31)) # 365
返回楊輝三角(9種方法)
# 1
# 1 1
# 1 2 1
# 1 3 3 1
# 1 4 6 4 1
# 1 5 10 10 5 1
# 1 6 15 20 15 6 1
# 1 7 21 35 35 21 7 1
def pascal1(n):
"""
楊輝三角
:param n: 行數(shù)
:return: n行楊輝三角
"""
list1 = [[0 for _ in range(1, p+1)] for p in range(1, n+1)]
if n <= 0:
return None
else:
for i in range(n):
if i == 0:
list1[0][0] = 1
elif i == 1:
list1[1][0] = list1[1][1] = 1
else:
for j in range(i+1):
if j == 0:
list1[i][j] = 1
elif j == i:
list1[i][j] = 1
else:
list1[i][j] = list1[i - 1][j - 1] + list1[i - 1][j]
return list1
def display(n):
for i in range(n):
for j in range(i+1):
print(pascal1(n)[i][j], end='\t')
print()
def pascal2():
list2 = [1]
while True:
yield list2
list2 = [sum(i) for i in zip([0] + list2, list2 + [0] )]
def pascal3():
list2 = [1]
while True:
yield list2
list2 = list(map(lambda x, y: x + y, [0] + list2, list2 + [0]))
def pascal4(n):
list2 = [1]
while True:
yield list2
list2 = [list2[i] + list2[i+1] for i in range(len(list2) - 1)]
list2.insert(0,1)
list2.append(1)
if len(list2) == n:
break
def pascal5(n):
for du in range(1, n+1):
a = [1 for _ in range(du)]
if 2 < du < n + 1:
for x in range(du-2):
a[x+1] = b[x] + b[x+1]
b = a
print(a)
def pascal6(n):
list2 = [1]
i = 0
while i < n:
yield list2
list2.append(0)
list2 = [list2[i-1] + list2[i] for i in range(len(list2))]
i += 1
def pascal7(n):
list = []
for _ in range(n):
for _ in range(len(list) - 1):
list.append(list.pop(0) + list[0])
list.append(1)
print(list)
def pascal8(n):
i, L = 0,[[1]]
while i < n:
yield (L[i])
list3 = [1] + [L[i][x] + L[i][x+1] for x in range(0, len(L[i]) - 1)] +[1]
L.append(list3)
i += 1
def pascal9(n):
for i in range(n):
if i < 2:
list1 =[1] * (1 + i)
else:
list1[1:-1] = [list1[i] + val for i, val in enumerate(list1[1:])]
print(list1)
if __name__ == '__main__':
display(8)
# for val in pascal8(10):
# print(val)
# n = 0
# for t in pascal4():
# print(t)
# n += 1
# if n == 10:
# break
# pascal9(10)
# for val in fib(10):
# print(val)