初学者入门Python基础七
文章目录
前言
本篇内容分享的是Python基础中的函数的使用,在一个程序中对于函数的调用是很重要的一部分,通过本篇内容也将学会Python进行函数声明的语法格式以及如何正确使用,同样也是通过demo进行演示。
一、什么是函数?
函数就是执行特定任务和完成特定功能的一段代码
为什么需要函数?
1)复用代码
2)隐藏实现细节
3)提高可维护性
4)提高可读性便于调试
二、函数的创建
定义一个函数实现两数之和
def calc(a,b): #a b 为形参 位置是在函数的定义处
c = a+b
return c
ret = calc(10,29) #10 29为实参 位置在函数的调用处
print(ret)
ret = calc(b = 10,a = 20) #= 左侧的变量名称为关键字参数
print(ret)
在函数内部进行数值添加
def fun(arg1,arg2):
print('arg1:',arg1)
print('arg2:',arg2)
arg1 = 100
arg2.append(10)
print('arg1:',arg1)
print('arg2:',arg2)
#return
n1 = 11
n2 = [22,33,44]
print('n1:',n1)
print('n2:',n2)
fun(n1,n2) #将位置传参 arg1 arg2是函数定义处的形参 n1 n2是函数调用处的实参 总结:实参名与形参名可以不一致
print('n1:',n1)
print('n2:',n2)
'''在函数调用过程中,进行参数传递
如果是不可变对象,在函数体的修改不会影响实参的值 arg1的修改为100 不会影响N1的值
如果是可变对象,在函数体的修改会影响实参的值 arg2值的添加会影响到n2的值
'''
输入一个范围分别输出偶数和奇数
print(bool(0)) #False 为偶数
print(bool(1)) #True 为奇数
def fun(num):
odd = [] #存奇数
even = [] #存偶数
for i in range(num):
if(i % 2):
odd.append(i)
else:
even.append(i)
return odd,even
print(fun(20)
从上面的结果我们可以看出当布尔值为0是返回False为偶数 布尔值为1返回True时为奇数,并且返回return 和我们以往接触的c语言的返回值也不一样。
注意:
#函数调用
'''函数的返回值
1) 如果函数没有返回值 函数执行完毕后 不需要给调用处提供数据 return可以省略不写
2) 函数的返回值 如果是1个直接返回类型
3) 函数的返回值 如果是多个 返回值为元组
'''
def fun1():
print('hello')
#return
fun1()
def fun2():
return 'hello'
res = fun2()
print(res)
def fun3():
return 'hello','world'
print(fun3())
三、函数参数问题
3.1 函数定义默认值参数
def fun(a,b = 10): #b为默认值参数
print(a,b)
#函数调用
fun(20)
fun(20,30)
3.2 个数可变的位置参数和关键字参数
个数可变的位置参数
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
使用*定义个数可变的位置形参
结果为一个元组
def fun(*arg): #函数定义时的,可变的位置参数 结果是元组
print(arg)
# print(arg[0])
fun(10)
fun(10,20,30)
个数可变的关键字参数
定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
使用**定义个数可变额关键字形参
结果为一个字典
def fun1(**arg): # 位置可变的关键字参数 结果是字典
print(arg)
fun1(a = 10)
fun1(a = 20,b = 30,c = 40)
注意点:
''''
def fun2(*arg,*a):
pass
以上代码会报错,可变的位置参数 只能是1个
'''
'''
def fun3(**arg,**a):
pass
以上代码会报错,个数可变的关键字参数 只能是1个
'''
def fun3(*args1,**args2):
pass
'''
def fun3(**args1,*args2)
pass
在一个函数定义过程中,既有个数可变的位置参数 又有个数可变的关键字参数
位置可变参数必须在前面,关键字参数在后面 ,要不然要报错
'''
3.3 传参demo
def fun(a,b,c): #abc在函数定义处 是形式参数
print('a = ',a)
print('b = ',b)
print('c = ',c)
#函数的调用
fun(10,20,30) #函数调用的时候参数传递 称为位置传参
lst = [11,22,33]
fun(*lst) #函数调用时将列表中的每个元素都转换成位置实参传入
print('---------------------------------------------')
fun(a = 100,c = 200,b = 250) #函数调用是 = 关键字传参
dic = {'a':111,'b':222,'c':333}
fun(**dic) #函数调用是 将字典中的键值对都转换为关键字实参传入
def fun(a,b = 10): #b 在函数的定义处 所以是形参 而且进行了赋值 所以b为默认值形参
print('a = ',a)
print('b = ',b)
def fun2(*args): #个数可变的位置形参
print(args)
def fun3(**args2): #个数可变的关键字形参
print(args2)
fun2(10,20,30,40)
fun3(a = 11,b = 22,c = 33,d = 44)
def fun4(a,b,*,c,d): #从*之后的参数 在函数调用时只能是关键字参数传递 *为关键字形参
print('a = ',a)
print('b = ',b)
print('c = ',c)
print('d = ',d)
#调用
#fun4(10,20,30,40) #位置实参传递
fun4(a = 10,b = 20,c = 30,d = 40) #关键字实参传递
fun4(10,20,c = 30,d = 40) #前两个参数,采用的是位置实参传递 后两个是关键字传递
'''
需求:c d 只能采用关键字实参传递
'''
'''函数定义时的形参的顺序问题'''
def fun5(a,b,*,c,d,**args):
pass
def fun6(*args,**args2):
pass
def fun7(a,b = 10,*args,**args2):
pass
3.4 变量作用域
def fun(a,b):
c = a + b #c为局部变量在函数体内起作用 a,b 为函数的形参也是在函数内部起作用
print(c)
#print(c) #会报错
name = 'Jack' #name作用范围是函数内部和外部都可以 ---》全局变量
print(name)
def fun2():
print(name)
#调用函数
fun2()
def fun3():
global age #函数内部定义的变量为局部变量 ,局部变量使用Global声明后实际为全局变量
age = 20
print(age)
fun3()
print(age)
3.5 递归函数
使用递归函数求5的阶乘
#5!
def fun(n):
if(n == 1):
return 1
else:
return n *fun(n-1)
120
斐波拉契数列
def fun2(n):
if(n == 1):
return 1
elif (n == 2):
return 1
else:
return fun2(n-1) + fun2(n-2)
#斐波拉契数列第6位上的数字
print(fun2(6))
#输出前6位
for i in range(1,7):
print(fun2(i))
对Python的基础知识到这就差不多学完了,通过这几篇的学习对Python的基础语法也有了认识,后面还是需要自己多练习,将基础的认识熟悉掌握。