函数:
 一
 概念:
 具有特定功能代码的集合
 这段代码用来解决一个问题,一类问题
 把这段代码封装起来,也就是功能,过程。
 当要重复使用一段代码,将其这段代码封装成函数,后面直接调用这个函数名即可。
一,无参函数的定义
 格式
     def 函数名() :    #括号里面什么都不写,表示无参
            函数体
     函数定义完成必须要调用。
     函数名()
def information():
	"""
	这段函数的注释
	"""
	print("想要两颗西柚")
#调用函数,调用几次就执行几次
information()
information()
结果显示:
 
 二,有参函数
格式
def   函数名(形式参数)
          函数体
调用
函数名(实参)
代码:
def information(name,age,gender):
	print("我叫",name)
	print("今年{}岁了".format(age))
	print("性别{}".format(gender))
#调用函数
information("xixi","18","女")
结果
 
 三,有返回值的函数
 当函数执行完成后,需要将某个结果显示给调用者,就需要return。
 举个栗子
 #如果我们需要函数运算,最后需要得到运算结果,此时我们就需要定义返回值
def add(x,y):
	sum = x + y
	#需要将返回
	return sum
a = float(input("please a num1:"))
b = float(input("please a num2:))
#调用
c = add(a,b)  
#return 需要接返回值
print("{} + {} = {}".format(a,b,c))
注:
 当有return时,在调用函数时,若直接调用函数,就会报错,因此需要用对象将return接着,就是
 对象名 = 函数名(实际参数)
 运行结果:
 
 四,全局变量在函数中的使用
a = float(input(“please a num1:”))
 b = float(input(“please a num2:”))
 这里的变量名称可以带定义为x,y
 因为这里的变量的是全局变量(本地变量),而函数里定义的变量为局部变量,并不影响。
五,函数的调用过程
 函数的初始化是在内存的堆中,在调用函数时会把整个函数压栈(先进后出),函数执行完成就会立刻出栈(弹栈),不在栈中。
msg = "hello"
index = 30     #全局变量
def show():
	a = 10     #局部变量
	print("start")
	print(msg)
	global index    
	
	index += 1
	print(index)
	print("ending")
show()
global   index 
如果注释掉这一行,你会发现报错
因为当调用函数时,里面的 index += 1,会改变全局变量,而index=30 是最初在栈中的值,但改变后,函数又被弹出。
全局变量这样是不能被改变的。
所以解决办法:
   就是声明全局函数
   格式
   global    全局变量
运行结果:

 六,值传递
def test (a,b):
	a += 10
	b += 20
	print("over")
a=100
b=200
test(a,b)
print(a,b)
运行结果
 
 七,引用传递
ef  test(msg):
	print("收到一个消息{}".format(msg))
	return "haha"
c = test     
print(c)     
运行结果:
 
出现的是test函数在堆中的地址,test函数存放在堆中,调用时出现test函数压栈,
 此时c=test 可用赋值理解,将test的地址给c
 所以c和test都指向test函数堆中的地址,因此结果为test函数地址
 因此c也是函数,因此可调用
def  test(msg):
	print("收到一个消息{}".format(msg))
	return "haha"
c = test     
c1 = c("cute")
print(c1)
               #c1为返回值
运行结果:
 
 八,函数的默认值
 有的参数值是固定的,该值一个默认值。
 当给定一个值(r,2),就按照给定的值算
 没给就按默认的值算
def get_circle_area(r, PI=3.14):     #PI= 3.14 就是给定的默认值
	return PI * r * r
r = float(input("请输入圆的半径:"))
area = get_circle_area(r, 2)         
print("半径为{}的圆,它的面试是{}".format(r, area))
r = float(input("请输入圆的半径:"))
area = get_circle_area(r)
print("半径为{}的圆,它的面试是{}".format(r, area))
结果:
 
 九,函数的递归
 在递归中,如果无结束条件,递归是一个死循环。
def sum(n):
	if n == 1:
		return 1      #当n = 1 时,不在调用sum()函数,直接返回1.
	return n + sum(n-1)
res = sum(100)
print("1-100的和{}".format(res))
十,
 (1)可变参数
 *变量名:
 def test(x,y,z,*args)
def  test(x,y,z,*args):
	print(x+y+z)
	print(args)
	#print(args[1],args[2])  :以下标取出参数
test(1,2,3,4,5,6,7,8)
超过普通参数,由可变参数接收
 *args:以元组方式接收其他参数
运行结果:
 
 (2)命名参数:
 **变量名:以键值对方式存
def  test(x,y,z,*args,**kwargs):
	print(x+y+z)
	print(args)
	print(kwargs)
test(1,2,3,4,5,6,7,8,age=16,name="xixi")
运行
 
 注:
 参数的顺序
 普通参数,默认参数,可变参数,命名参数
 以上两个都是:需要保留扩展函数功能时使用
 (3)匿名函数
def haha(hi):      # 函数引用传递,hi()此时为一个函数,相当于xixi()
	hi()
def xixi():
	print("nihao")
haha(xixi)
等价于
python默认不支持匿名函数,所以引入lambda表达式
 格式
      lambda [参数1,参数2]:语句
def haha(hi):
	hi()
haha(lambda:print("nihao"))
运行
 
 (4)全局函数
  eval     默认以逗号分隔元素
>>> a = eval(input("entar three number:"))
entar number:(1,2,3)     
>>> a
(1, 2, 3)
>>> x,y,z = eval(input("entar three number:"))
entar number:1,2,3
>>> x
1
>>> y
2
>>> z
3
(5)返回多个值
def function():
	a =1
	b =2
	c =3
	return a,b,c
#res = function()
#print(res)
x,y,z = function()    这是元素,  注释掉的两行与后两行等价,(x,y,z) = function()  , 以元组
print(x,y,z)
运行
 
转载:https://blog.csdn.net/weixin_44034479/article/details/104448835
