知識回顧
列表声诸,字典,元組退盯,集合
列表(list):[];可變彼乌,有序泻肯;元素是任何類型的數(shù)據(jù)
增:append,insert慰照,extend
刪:del灶挟,remove,pop
改:列表[下標(biāo)] = 新值
查:列表[下標(biāo)]毒租,切片稚铣,遍歷
字典(dict):{};可變,無序墅垮;元素是鍵值對惕医,鍵是不可變的惟一的,值可以是任何類型的數(shù)據(jù)
增:字典[key] = 值算色,setdefault(key,默認(rèn)值)抬伺,update
刪:del,pop灾梦,clear
改:字典[key] = 值
查:字典[key]峡钓,字典.get(key),字典.get(key,默認(rèn)值),遍歷
元組(tuple):();不可變,有序斥废;元素是任何類型的數(shù)據(jù)
查:和列表一樣
tuple1 = 1, 2, 3
tuple2 = (10,)
x,y = (10, 20)
x,y = 10, 20
x, *nums, y = tuple1
集合(set):{};可變椒楣,無序;元素是不可變的惟一的
增:add牡肉,update
刪:remove
改:遍歷
集合運算:包含(>=,<=),交集(&)捧灰,并集(|),差集(-)统锤,補(bǔ)集(^)
淺拷貝和深拷貝
import copy
copy.copy(對象):淺拷貝
copy.deepcopy(對象):深拷貝
拷貝:將變量中的值復(fù)制一份毛俏,產(chǎn)生新的數(shù)據(jù)。然后將新的數(shù)據(jù)對應(yīng)的地址返回饲窿。
淺拷貝:直接拷貝地址(切片和字典列表的copy方法都是淺拷貝)
深拷貝:將地址地址對應(yīng)值拷貝煌寇,產(chǎn)生新的地址
a1 = [1, 2]
a2 = {'a': 10}
list1 = [a1, a2]
# 淺拷貝
# list2 = list1.copy()
# list2 = copy.copy(list1)
# 深拷貝
list2 = copy.deepcopy(list1)
list2.append(10)
print(list1)
print(list2)
list2[0].append(100)
print(list1)
print(list2)
字典和列表的應(yīng)用
列表的元素和字典的值可以是任何類型的數(shù)據(jù)
1.列表中有字典
persons = [
{'name': '張三', 'age': 30, 'sex': '男'},
{'name': '李四', 'age': 25, 'sex': '女'},
{'name': '王五', 'age': 40, 'sex': '男'}
]
print(persons)
print(persons[1]['name'])
找出person中年齡最大的人的名字
max_age = 0
for index in persons:
if index['age'] > max_age:
max_age = index['age']
name = index['name']
print('年齡最大的是:', name, max_age)
2.字典中有列表
寫一個程序,保存一個班級的信息逾雄,包含班級阀溶,位置,所有學(xué)生(學(xué)生中需要保存名字鸦泳、年齡和學(xué)校)
my_class = {
'class_name': 'python1807',
'location': '18-6',
'all_student': [
{'name': '小華', 'age': 18, 'school': '清華'},
{'name': '小明', 'age': 20, 'school': '北大'},
{'name': '小紅', 'age': 20, 'school': '川大'}
]
}
print(my_class['all_student'][0]['school'])
練習(xí):在班級中添加一個學(xué)生银锻,姓名:老王,年齡:40做鹰,學(xué)校:北大青鳥
print('___________________')
print('添加信息')
name = input('姓名:')
age = int(input('年齡:'))
school = input('學(xué)校:')
new_student['name'] = name
new_student['age'] = age
new_student['school'] = school
new_student = {'name': name, 'age': age, 'school': school}
print(new_student)
my_class['all_student'].append(new_student)
print(my_class['all_student'])
2.練習(xí):刪除班級中年齡小于20歲的學(xué)生
for index in my_class['all_student']:
if index['age'] < 20:
my_class['all_student'].remove(index)
print(my_class['all_student'])
all_student = my_class['all_student']
for student in all_student[:]:
if student['age'] < 20:
all_student.remove(student)
print(my_class)
index = 0
while index < len(all_student)
student = all_student
if student['age'] < 20:
del all_student[index]
continue
index += 1
print(my_class)
函數(shù)的聲明
函數(shù)就是對實現(xiàn)某一特定功能代碼段的封裝
分類:自定義函數(shù)(程序員自己聲明實現(xiàn)其功能)和內(nèi)置函數(shù)(系統(tǒng)已經(jīng)聲明實現(xiàn)完成)
1.聲明函數(shù)語法
def 函數(shù)名(參數(shù)列表):
函數(shù)體
說明:
a.def --> python中聲明函數(shù)的關(guān)鍵字
b.函數(shù)名 --> 標(biāo)識符击纬,不能是關(guān)鍵字。遵守PEP8命名規(guī)范(所有字母小寫钾麸,多個單詞用下劃線隔開)
見名知義(看見名字知道函數(shù)的功能)
c.() --> 固定格式
d.參數(shù)列表 --> 形參列表更振,參數(shù)名1炕桨,參數(shù)2,...
可以有多個參數(shù)肯腕,也可以沒有
參數(shù)是用來從函數(shù)的外部給函數(shù)里面?zhèn)髦涤玫?br>
e. : --> 固定格式
f.函數(shù)體 --> 就是實現(xiàn)函數(shù)功能的代碼段
2.初學(xué)者聲明函數(shù)的步驟
a.確定函數(shù)的功能
b.根據(jù)功能確定函數(shù)名
c.確定參數(shù):確定有沒有献宫,確定有幾個(看實現(xiàn)函數(shù)的功能需不需要從函數(shù)外面?zhèn)髦担枰獋鲙讉€)
d.實現(xiàn)功能函數(shù)
e.確定返回值
3.函數(shù)的調(diào)用
聲明函數(shù)的時候实撒,不會執(zhí)行函數(shù)體遵蚜。函數(shù)只有在函數(shù)調(diào)用的時候才會執(zhí)行
語法:
函數(shù)名(實參列表)
說明:
函數(shù)名 --> 必須是已經(jīng)聲明過的函數(shù)
() --> 固定的
實參列表 --> 數(shù)據(jù)1 ,數(shù)據(jù)2...
用來給形參賦值
寫一個函數(shù)奈惑,打印兩個數(shù)的和
def my_sum(num1, num2):
print(num1 + num2)
寫一個函數(shù),打印五個'*'
def print_star():
print('*' * 5)
寫一個函數(shù)睡汹,打印n個'*'
def print_star2(n):
print('*' * n)
練習(xí):寫一個函數(shù)肴甸,計算1+2+...+n的和
def my_sum2(n):
sum1 = 0
for index in range(n + 1):
sum1 += index
print('1+2+...+', index, '=', sum1)
my_sum2(100)
函數(shù)的調(diào)用
1.格式
函數(shù)名(實參列表)
2.函數(shù)的調(diào)用過程(重點)
第一步:回到函數(shù)聲明的位置
第二步:用實參給形參賦值(傳參:一定要保證每個參數(shù)都有值)
第三步:執(zhí)行函數(shù)體
第四步:返回值 --> 返回給函數(shù)調(diào)用表達(dá)式
第五步:執(zhí)行完函數(shù)體回到函數(shù)調(diào)用的位置,接著執(zhí)行后面的代碼
def sum2(num1, num2):
print(num1 + num2)
sum2(10, 20)
函數(shù)的參數(shù)
1.位置參數(shù)和關(guān)鍵字參數(shù)
位置參數(shù):按照參數(shù)的順序一一給形參賦值
關(guān)鍵字參數(shù):按照關(guān)鍵字一一給形參賦值
def fun1(a, b, c):
print('a', a, 'b', b, 'c', c)
# 位置參數(shù)
fun1(10, 20, 30)
# 關(guān)鍵字傳參
fun1(c=300, b=200, a=100)
2.默認(rèn)參數(shù)
**函數(shù)聲明的時候可以給參數(shù)設(shè)置默認(rèn)值囚巴,但是有默認(rèn)值的參數(shù)原在,必須放在參數(shù)列表的最后
有默認(rèn)值的參數(shù),在調(diào)用的時候可以不用傳參**
def fun2(a, c, b=0):
print('a:', a, 'b:', b, 'c:', c)
fun2(10, 20)
fun2(100, 200, 300)
def fun3(a=10, c=20, b=0):
print('a:', a, 'b:', b, 'c:', c)
fun3(a=100, b=200)
fun3(100, b=200)
3.不定長參數(shù)
*參數(shù)的個數(shù)不確定的時候彤叉,可以在形參的前面加庶柿,將這個形參變成一個元組,用來接收多個參數(shù)
注意:如果函數(shù)有多個參數(shù)秽浇,那么不定長參數(shù)要放在最后**
寫一個函數(shù)浮庐,計算多個數(shù)的和
def my_sum(*nums):
print(sum(nums))
my_sum()
my_sum(1)
my_sum(1, 2)
def fun4(name, age, *scores):
print(name, age, scores)
fun4('小花', 20, 98, 99, 85)
函數(shù)的返回值
函數(shù)的返回值就是函數(shù)調(diào)用表達(dá)式的值,就是return關(guān)鍵字后面的表達(dá)式的值柬焕。
python中所有的函數(shù)都有返回值审残,返回值的默認(rèn)值是None
執(zhí)行函數(shù)體沒有遇到return,函數(shù)的返回值就是None斑举;函數(shù)的返回值是return后面的值
函數(shù)調(diào)用表達(dá)式 --> 調(diào)用函數(shù)的語句(函數(shù)名(實參))
return --> 關(guān)鍵字搅轿,只能寫在函數(shù)體中。用來返回返回值和結(jié)束函數(shù)
注意:看一個函數(shù)的返回值富玷,只看有沒有遇到return璧坟。只要沒有遇到return就是None,遇到return就是return后面的值
情況一:沒有return
def fun1():
print('hello python!')
# 將返回值賦給一個變量
re = fun1()
print(re)
# 直接打印返回值
print(fun1())
# 將返回值作為列表的元素
list1 = [fun1(), 1]
print(list1)
情況二:有return
執(zhí)行函數(shù)的時候赎懦,一旦遇到return雀鹃,函數(shù)就直接結(jié)束。并且把return后面的結(jié)果作為返回值
def func2():
print('_________')
print('++++++++')
print('***********')
return 100
print('11111111')
re = func2()
print(re)
注意:并不是只要函數(shù)中有return铲敛,函數(shù)的返回值就是return后面的值
def func3(n):
if n % 2:
return '是奇數(shù)'
print(func3(4))
print(func3(5))
如果實現(xiàn)函數(shù)的功能會產(chǎn)生新的數(shù)據(jù)褐澎,就將新的數(shù)據(jù)返回。如果不會產(chǎn)生新的數(shù)據(jù)就不用返回值
寫一個函數(shù)伐蒋,功能是計算一個數(shù)的階乘
def jie_cheng(num):
sum1 =1
for x in range(1, num + 1):
sum1 *= x
return sum1
re = jie_cheng(10)
print(re)
# 寫一個函數(shù)工三,打印問候語:‘吃飯了嗎迁酸?’
def say_hello():
print('吃飯了嗎?')
作業(yè)
- 編寫一個函數(shù)俭正,求1+2+3+...+N
def my_sum(n):
sum1 = 0
for x in range(1, n+1):
sum1 += x
return sum1
num = int(input('請輸入結(jié)束的數(shù):'))
print('1 + 2 + ... + ', num, '=', my_sum(num))
結(jié)果
- 編寫一個函數(shù)奸鬓,求多個數(shù)中的最大值
def my_max(n):
return max(n)
list1 = [15, 565, 64, 56, -23]
print(list1)
print('最大的數(shù)是:', my_max(list1))
結(jié)果
- 編寫一個函數(shù),實現(xiàn)搖骰子的功能掸读,打印n個骰子的點數(shù)和
def sum_shaizi(n):
sum1 = 0
for index in range(n):
num = random.randint(1, 6)
print('第', index + 1, '顆點數(shù):', num)
sum1 += num
return sum1
num_shaizi = int(input('輸入骰子的個數(shù):'))
print('點數(shù)和:', sum_shaizi(num_shaizi))
結(jié)果
- 編寫一個函數(shù)串远,交換指定字典的key和value。
如:{'a':1, 'b':2, 'c':3} ---> {1:'a', 2:'b', 3:'c'}
def change_key_value(n):
for index in list(n):
key = index
value = n[index]
del n[index]
n[value] = key
return n
dict1 = {'a': 1, 'b': 2, 'c': 3}
print(change_key_value(dict1))
結(jié)果
- 編寫一個函數(shù)儿惫,提取指定字符串中的所有的字母澡罚,然后拼接在一起后打印出來
如:'12a&bc12d--' ---> 打印'abcd'
def abc(n):
str1 = ''
for word in n:
if word.isalpha():
str1 += word
return str1
str2 = input('輸入一個字符串:')
print(abc(str2))
結(jié)果
- 寫一個函數(shù),求多個數(shù)的平均值
def aver(*nums):
num_ave = 0
count = 0
sum1 = 0
for num in nums:
for index in num:
sum1 += index
count += 1
print(num, '的平均數(shù)是:', end='')
return sum1 / count
list2 = [545, 4, 45, 95, 56]
print(aver(list2))
結(jié)果
- 寫一個函數(shù)肾请,默認(rèn)求10的階層留搔,也可以求其他數(shù)的階層
def jie_cheng(n=10):
num1 = 1
for x in range(1, n + 1):
num1 *= x
return num1
print(jie_cheng())
print(jie_cheng(5))
結(jié)果
- 寫一個函數(shù),可以對多個數(shù)進(jìn)行不同的運算
如: operation('+', 1, 2, 3) ---> 求 1+2+3的結(jié)果 operation('-', 10, 9) ---> 求 10-9的結(jié)果 operation('', 2, 4, 8, 10) ---> 求 24810的結(jié)構(gòu)
def operation(flag, *nums):
num1 = 1
if flag == '+':
for num in nums:
print(num)
return sum(num)
elif flag == '-':
count = 1
for num in nums:
print(num)
for x in num:
while count == 1:
num1 = x
count += 1
num1 -= x
return num1
elif flag == '*':
for num in nums:
print(num)
for x in num:
num1 *= x
return num1
elif flag == '/':
count = 1
for num in nums:
print(num)
for x in num:
num1 /= x
return num1
else:
print('輸入的運算符有誤')
list1 = [10, 3, 5, 7, 9]
flag = input('輸入要進(jìn)行的運算(+铛铁,-隔显,*,/):')
print(operation(flag, list1))
結(jié)果
9.寫一個函數(shù)饵逐,求指定列表中括眠,指定的元素的個數(shù)
def sum1(list2, ele):
count = 0
print(list2)
print(ele, '的個數(shù):', end='')
for index in list2:
if str(index) == ele:
count += 1
return count
list1 = [1, 1, 2, 2, 2, 'a', 'a', 'abc']
ele1 = str(input('下列列表中,輸入要統(tǒng)計的元素:'))
print(sum1(list1, ele1))
結(jié)果
10.寫一個函數(shù)倍权,獲取指定列表中指定元素對應(yīng)的下標(biāo)(如果有多個掷豺,一起返回)
def xia_biao(list2, ele):
xiabiao = 0
while xiabiao <= len(list2) - 1:
for index in list2:
if str(index) == ele:
print(xiabiao)
xiabiao += 1
else:
xiabiao += 1
list1 = [1, 1, 2, 2, 2, 'a', 'a', 'abc']
print(list1)
ele1 = str(input('該列表中,輸入要獲取下標(biāo)的元素:'))
xia_biao(list1, ele1)
結(jié)果