python进阶之路
Day9
hello world!今日是python学习的第九天,我将会在下面文章对基础语法进行一些介绍,主要为函数的补充学习、变量的作用域与匿名函数等。
1. 函数的参数
1.1 位置参数和关键字参数(实参)
根据函数调用的时候实参的传递方式将实参分为位置参数和关键字参数
1) 位置参数 - 调用函数的时候直接在括号里面写多个实参,实参与形参一一对应。
2) 关键字参数 - 调用函数的时候以 形参名=实参 的形式来确定实参。(位置不影响结果)
函数定义的时候需要空两行
def func1(a,b,c):
print(f'a:{a},b:{b},c:{c}')
func1(20,30,40)
func1(30,20,40)
func1(a=100,b=200,c=300)
func1(b=200,a=100,c=300)
关键字参数不能重复,也不能少参数。每个形参必须传递一个实参。
关键字参数与位置参数可以混合使用,但是位置参数必须在关键字参数的前面。
不管以什么样的形式传参,最终都要保证每个参数都有值。
func1(10,c=30,b=20)
1.2 参数默认值(形参)
在定义函数的时候,可以给形参赋默认值;如果一个形参有默认值,那么这个参数在调用的时候可以不用传参。
如果定义函数的时候有的参数有默认值,有的参数没有默认值;没有默认值的参数必须放在前面。
def func2(a = 10,b = 20,c = 30):
print(f'a:{a},b:{b},c:{c}')
func2()
func2(b=900)
1.3 不定长参数 - 参数个数不确定
1) 在一个参数前加*(本质是一个元组),那么这个参数就是不定长参数,可以同时接收多个实参
注意:a.带的参数的本质就是一个元组;
b.在调用的时候必须使用位置参数传参。
2) 定义函数的时候在一个参数前加*,那么这个参数就是一个不定长参数,可以同时接收多个实参,
注意:a.带**的参数的本质就是一个字典;
b.在调用的时候必须使用关键字参数传参。
练习:定义一个函数求多个数的和
def sum1(*nums):
# *nums就是一个元组
print(nums)
sum1()
sum1(10)
sum1(10,20,30,40)
定义一个函数计算一个学生所有的总成绩
def total_score(name,*scores):
pass
def func5(**num):
pass
面试题: 定义函数的时候经常看到函数的参数: *args,**kwargs,其存在的价值是什么?
两种不定长参数一起用,最终还是实现一个参数个数不定的函数,但两个形式一起用可以达到位置参数与关键字参数可以同时用的效果。
1.4 参数类型说明
def func7(a:str,b):
print(a,b)
func7()
def func8(list1:list): # 有提示时方便自己。
list1.append()
2. 函数的返回值
def sum1(num1,num2):
# 在函数内部返回的数据不使用返回值,该数据会被销毁。
total = num1 + num2
print(total)
sum1(10,20)
2.1 什么是返回值?
1)概念
返回值就是从函数内部传递到函数外部的数据;
返回值就是return关键字后面的表达式的值;
返回值就是函数调用表达式的值。
2)return关键字
return时只能在函数体中使用的关键字,作用有两个:
a. 确定函数返回值(return后面是什么,函数的返回值就是什么)
b. 提前结束函数(只要遇到return,整个函数直接结束)
注意:如果在执行函数的时候没有遇到return,函数的返回值为 None。
3) 函数调用表达式
调用函数的表达式就是函数调用表达式;当函数调用结束后,函数调用表达式的值就是函数值。
2.2 怎么确定函数是否需要返回值:看实现函数的功能会不会产生新的数据。如果有就将新的数据作为返回值返回
练习:定义一个函数获取指定字符串中所有的数字字符
def get_num(str1):
num_str = ''
for x in str1:
if '0' <= x <= '9':
num_str += x
return num_str
用变量保存函数调用表达式的值,其实就是保存函数的返回值。
get_num('sdfd52fdf5e354d2f45')
print(get_num('sdfd52fdf5e354d2f45'))
返回值对应的数据能做的事情函数调用表达式都可以做。
def sum1(a:int,b:int):
return a+b
print(sum1(10,20))
num1 = 30
num2 = sum1(10,20)
list1 = [30,sum1(10,20)]
print(list1)
def create_list():
return [1,2]
print([1,2][-1])
print(create_list()[-1])
2.3 函数调用过程(执行过程)
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值:传参的时候必须保证每个参数都有值)
第三步:执行函数体
第四步:执行完函数体确定返回值
执行完函数体:a执行到函数体的最后 b遇到了return
怎么确定返回值:看函数执行完成的时候有没有遇到return,遇到返回值就是return后面的值
没有遇到return返回值就是None。
第五步:回到函数调用的位置接着往后执行(这个时候函数调用表达式的值就是函数的返回值)
2.4 多个返回值
函数的返回值永远只有一个,如果要同时返回多个数据,就返回一个容器,常用元组。
如果一个函数要同时返回多个,将多个数据作为一个元组(容器)中的元素返回。
3.变量的作用域
变量的作用域:变量的使用范围,根据变量使用范围,我们将变量分为全局变量与局部变量两种。
3.1 全局变量和局部变量
1) 全局变量
定义在函数和类的外部的变量就是全局变量。
作用域:从定义开始到文件结束的任何位置都能使用
2) 局部变量
定义在函数中的变量就是局部变量
作用域:从定义开始到函数结束的任何位置都能使用。
# =================全局变量=======================
# a是全局变量
a = 10
x
for x in range(4):
# y是全局变量
y = 10
pass
print(a,x,y)
# ======================局部变量============================
# x1,y1,a1都是局部变量
def func2(x1,y1):
a1 = 10
print('函数内部:',x1,y1,a1)
3) global 和nonlocal
global只能在函数体当中使用;
global:用global可以在函数体内部定义一个全局变量
nonlocal:在局部的局部中修改局部变量的时候。
name = '小明'
age = 18
def show_message():
name = '小花' # 重新定义了一个name的局部变量。
print(name)
# print(age) # 用glabal声明的变量只能在声明以后使用。
global age# 声明age为全局变量的地址。
age = 20
print(age)
show_message()
print(name)
print(age)
def func3():
num = 100
def func4():
# nonlocal num
num = 200
print('函数中的函数',num)
func4()
print(num)
func3()
有一个银行账号,定义两个函数,对这个账号进行存钱与取前的操作,调用函数进行多次存钱与取钱的操作后打印余额。
pensonal_account = {'id':622700521356984215,'name':'荀彧','balance':10000}
balance1 = pensonal_account['balance']
def store_money(moneynum:int):
global balance1
balance1 += moneynum
return balance1
def takeout_money(moneynum:int):
global balance1
if balance1 <= moneynum:
print(f'您的余额不足了,余额为:',end = '')
return balance1
else:
balance1 -= moneynum
return balance1
print(store_money(2000))
print(takeout_money(20000))
4.1 匿名函数
匿名函数的本质还是函数,除了定义的语法以外,其他的和普通的函数没有区别
语法:
函数名 = lamda 参数列表:返回值
相当于:
def 函数名(参数列表):
return 返回值
写一个匿名函数求两个数的和:
sum1 = lambda num1,num2 : num1+num2
def sum1(num1,num2):
return num1+num2
练习:写一个匿名函数,根据年龄的范围返回成年,未成年
is_adult = lambda age : '未成年' if 0 <= age <= 18 else '成年'