程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python基礎(四)

編輯:Python

文章目錄

  • 函數
  • 函數參數
  • 其他知識
    • 拆包
    • 交換倆個變量的值
    • 引用
    • 可變與不可變
  • 函數加強篇
    • 遞歸
    • Lambda表達式
      • 參數形式
      • 應用
    • 高階函數
    • 模塊
  • 學員管理系統

函數

函數就是將⼀段具有獨⽴功能的代碼塊,整合到⼀個整體並命名,在需要的位置調⽤這個名稱即可完成對應的需求。函數在開發過程中,可以更⾼效的實現代碼重⽤

def 函數名(參數):
代碼1
代碼2
函數名(參數):調用函數

需求1:制作計算器,計算任意倆個數字之和,並且保存結果

def sum_num(a,b):
return a+b
result = sum_num(1, 2)
print(result)

(1)說明文檔:如果代碼多,我們不需要在很多代碼中找到這個函數定義的位置才能看到注釋。如果想更⽅便的查看函數的作⽤,可以借助函數的說明文檔。

(2)函數嵌套使用:一個函數裡面又嵌套了另外一個函數。

如果函數A中,調⽤了另外⼀個函數B,那麼先把函數B中的任務都執⾏完畢之後才會回到上次函數A執⾏的位置。

需求2:打印多條橫線

def print_line():
print('-'*20)
def print_lines():
i=0
while i<=10:
print_line()
i+=1
print_lines()

(3)變量作用域:局部變量和全局變量
作用:在函數體內部,臨時保存數據,即當函數調⽤完成後,則銷毀局部變量。


誤區:

不是。因為第十五行得到a的數據仍然是100,仍然是定義全局變量a的時候的值,而沒有返回值,而沒有返回testB函數內部的200。綜上,testB的內部a=200只是定義了一個局部變量。

如何在函數體內部修改全局變量:

(4)return:return a, b返回多個數據的時候,默認是元組類型。return後⾯可以連接列表、元組或字典,以返回多個值。

(5)多函數執行流程:

函數參數

  1. 位置參數:調用函數時根據函數定義的參數位置來傳參。傳遞和定義參數的順序要保持一致。
  2. 關鍵字參數
    函數調⽤,通過“鍵=值”形式加以指定。可以讓函數更加清晰、容易使⽤,同時也清除了參數的順序需求。
def user_info(name, age, gender):
print(f'您的名字是{
name},年齡是{
age},性別是{
gender}')
user_info('Rose', age=20, gender='⼥')
user_info('⼩明',gender='男',age=16)

note:函數調⽤時,如果有位置參數時,位置參數必須在關鍵字參數的前⾯,但關鍵字參數之間不存在先後順序。

  1. 缺省參數
    缺省參數也叫默認參數,⽤於定義函數,為參數提供默認值,調⽤函數時可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調⽤)。
    函數調⽤時,如果為缺省參數傳值則修改默認參數值;否則使⽤這個默認值。
  2. 不定長參數:可變參數(用於不確定調用的時候傳遞多少個參數。此時,可以用包裹packing位置參數或者包裹關鍵字參數來進行參數傳遞)
    (1)包裹位置傳遞:傳進的所有參數都會被args變量收集,它會根據傳進參數的位置合並為⼀個元組(tuple),args是元組類型,這就是包裹位置傳遞。
    (2)包裹關鍵字傳遞

name指的是變量名,不加引號。

綜上,無論是包裹位置傳遞或者包裹關鍵字傳遞,都是一個組包過程。

其他知識

拆包

#拆包元組
def return_num():
return 100, 200
num1, num2 = return_num()
print(num1)# 100
print(num2)# 200
#拆包字典
dict1 = {
'name':'TOM', 'age':18}
a, b = dict1#對字典進⾏拆包,取出來的是字典的key
print(a)# name
print(b)# age
print(dict1[a])# TOM
print(dict1[b])# 18

交換倆個變量的值

c=a
a=b
b=c
a,b=1,2
a,b=b,a
print(a)
print(b)

引用

在python中,值都是靠引用傳遞的。(數據通過變量傳遞)我們可以⽤id()來判斷兩個變量是否為同⼀個值的引⽤。我們可以將id值理解為那塊內存的地址標識。

# 1.不可變: int類型
a = 1
b = a
print(b)# 1
print(id(a))# 140708464157520
print(id(b))# 140708464157520
a = 2# 因為修改a的數據,內存需要再開辟另外一空間存儲
print(b)# 1,說明int類型為不可變類型
print(id(a))# 140708464157552,此時得到是的數2的內存地址
print(id(b))# 140708464157520
# 2.列表
aa = [10, 20]
bb = aa
print(id(aa))# 2325297783432
print(id(bb))# 2325297783432
aa.append(30)
print(bb)# [10, 20, 30],列表為可變類型
print(id(aa))# 2325297783432
print(id(bb))# 2325297783432


引用當作實參:

def test1(a):
print(a)
print(id(a))
a += a
print(a)
print(id(a))
# int:計算前後id值不同
b = 100
test1(b)
#列表:計算前後id值相同
c = [11, 22]
test1(c)

可變與不可變

數據能夠直接進⾏修改,如果能直接修改那麼就是可變,否則是不可變類型

函數加強篇

遞歸

特點:函數內部自己調用自己+必須有出口

# 3+2+1
def sum(i):
if i==1
return 1
return i+sum(i-1)

Lambda表達式

應用場景:一個函數有一個返回值,並且只有一句代碼,可以用Lambda簡化

lambda 參數列表:表達式

(1)使用Lanbda表達式相比函數,可以簡化代碼所占的內存
(2)Lambda的參數可有可⽆,函數的參數lambda在表達式中完全適⽤。
(3)lambda函數能接收任何數量的參數但只能返回⼀個表達式的值

fn2=lambda:100
print(fn2)#直接打印Lambda表達式,輸出的是內存地址(匿名函數)
print(fn2())#無參調用
fn3=lambda a,b:a+b
print(fn3(1,2))
print((lambda a,b:a+b)(1,2))

參數形式

# 無參
print((lambda:100)())
# 一個參數
print((lambda a:a)('hello'))
# 默認參數
print((lambda a,b,c=100:a+b+c)(10,20))
# 可變參數:接受不定長位置參數,返回元組
print((lambda *args:args)(10,20,30))
#接受不定長的關鍵字參數,返回字典
print((lambda**kwargs: kwargs)(name='python', age=20))

應用

# 判斷
fun=lambda a.b:a if a>b else b
print(100,22)
#列表數據按照字典的key值進行排序
students = [{
'name':'TOM', 'age':20},'name':'ROSE','age':19},{
'name':'Jack','age':22}
#按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)
#按name值降序排列
students.sort(key=lambdax: x['name'],reverse=True)
print(students)

高階函數

函數作為另外一個函數的參數傳入的編程模式稱為高階函數,高階函數是函數式編程的體現,是一種高度抽象的編程形式。

# 求絕對值
abs(-10) # 10
def add_num(a, b):
return abs(a) +abs(b)
result = add_num(-1, 2)
print(result)# 3
def sum_num(a, b, f):
return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result)# 用f代替abs

函數式編程⼤量使⽤函數,減少了代碼的重復,因此程序⽐較短,開發速度較快。

模塊

將函數存儲在被稱為模塊的獨立文件中,再將模塊導入主程序中。import語句允許在當前運行的程序文件中使用模塊中的代碼。
(1)創建模塊:
(2)導入特定函數
(3)使用as給函數起別名
(4)使用as給模塊指定別名

(5)導入模塊的所有函數

模塊定位順序:

當導⼊⼀個模塊,Python解析器對模塊位置的搜索順序是:
1.當前⽬錄
2.如果不在當前⽬錄,Python則搜索在shell變量PYTHONPATH下的每個⽬錄。
3.如果都找不到,Python會察看默認路徑。UNIX下,默認路徑⼀般為/usr/local/lib/python/

模塊搜索路徑存儲在system模塊的sys.path變量中。變量⾥包含當前⽬錄,PYTHONPATH和由安裝過程決定的默認⽬錄。注意⾃⼰的⽂件名不要和已有模塊名重復,否則導致模塊功能⽆法使⽤使⽤from模塊名import功能
的時候,如果功能名字重復,調⽤到的是最後定義或導⼊的功能。

如果⼀個模塊⽂件中有__all__變量,當使⽤from xxx import *導⼊時,只能導⼊這個列表中的元素。

包將有聯系的模塊組織在⼀起,即放到同⼀個⽂件夾下,並且在這個⽂件夾創建⼀個名字為__init__.py⽂件,那麼這個⽂件夾就稱之為包。


學員管理系統

需求
進⼊系統顯示系統功能界⾯,功能如下:
(1)添加學員
(2)刪除學員
(3)修改學員信息
(4)查詢學員信息
(5)顯示所有學員信息
(6)退出系統
系統共6個功能,⽤戶根據⾃⼰需求選取。

步驟
1.顯示功能界⾯
2.⽤戶輸⼊功能序號
3.根據⽤戶輸⼊的功能序號,執⾏不同的功能(函數)

#功能函數的作用都是操作學員,每個學員的信息用字典存儲,
# 存儲全部學員信息應該是全局變量列表
info=[]
# 顯示功能函數
def print_info():
print('-'*20)
print('歡迎登錄學員管理系統')
print('1:添加學員')
print('2:刪除學員')
print('3:修改學員信息')
print('4:查詢學員信息')
print('5:顯示所有學員信息')
print('6:退出系統')
print('-'*20)
#添加學員信息
def add_info():
new_id=input("請輸入學號")
new_name=input("請輸入姓名")
new_tel=input("請輸入手機號")
global info#聲明全局變量
for i in info:
if new_name==i['name']:
print("該用戶已經存在")
return
info_dict={
}
info_dict["id"]=new_id
info_dict["name"]=new_name
info_dict["tel"]=new_tel
info.append(info_dict)
print(info)
# 刪除學員信息
def del_info():
"""刪除學員"""
while True:
del_id = int(input('請輸⼊要刪除的學員學號:'))
global info
#檢查學員是否存在
#如果存在則刪除列表指定下標的數據
if 0<= del_id<len(info):
del_flag = input('確定要刪除嗎?yes or no')
if del_flag == 'yes':
del info[del_id]
print(info)
break
#刪除了⽬標學員信息後退出循環
else:
print('輸⼊學員有誤,請重新輸⼊')
def modify_info():
"""修改學員信息"""
while True:
modify_num = int(input('請輸⼊要修改的學員學號:'))
global info
#檢查這個學員是否存在,存在則打印學員信息,並按⽤戶輸⼊修改
if 0<= modify_num<len(info):
print(f'該學員學號是{
info[modify_num]["id"]},姓名是{
info[modify_num]["name"]},⼿機號是{
info[modify_num]["tel"]}')
info[modify_num]["id"] = input('請輸⼊學號:')
info[modify_num]["name"] = input('請輸⼊姓名:')
info[modify_num]["tel"] = input('請輸⼊⼿機號:')
print(info)
break
else:
print('輸⼊學員有誤')
def search_info():
"""查詢學員信息"""
search_name = input('請輸⼊要查找的學員姓名:')
for i in info:
if search_name == i['name']:
print('***查詢到信息如下***')
print(f'該學員學號是{
i["id"]},姓名是{
i["name"]},⼿機號是{
i["tel"]}')
break
else:print('查⽆此⼈......')
# 用戶輸入功能
while True:
print_info()
user_num=int((input("請輸入功能序號")))
if user_num == 1:
add_info()
elif user_num == 2:
del_info()
elif user_num == 3:
modify_info()
elif user_num == 4:
search_info()
elif user_num == 5:
print('學號\t姓名\t⼿機號')
for i in info:
print(f'{
i["id"]}\t{
i["name"]}\t{
i["tel"]}')
elif user_num == 6:
exit_flag = input('確定要退出嗎?yes or no')
if exit_flag == 'yes':
break
else:
print("輸入的功能有誤")

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved