函数、变量、参数

函数

概念

函数是一个功能,是代码复用的通用机制

分类

1.内置函数

2.标准库中的函数

3.第三方库的函数

4.自定义函数

语法

def 函数名(参数列表):

  代码块

注意:

return返回值:如果有return语句,则结束函数并返回值,如若没有则返回None

lambda 表达式和匿名函数 

lambda 表达式可以用来声明匿名函数。lambda 函数是一种简单的、在同一行中定义函数 的方法。lambda 函数实际生成了一个函数对象。
lambda 表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数 的返回值。 

f = lambda a,b:a+b
print(f(2,3))   #5

递归函数

递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己 

每个递归必须包含两个部分:

1. 终止条件

表示递归什么时候结束。一般用于返回值,不再调用自己。 2. 递归步骤

把第 n 步的值和第 n-1 步相关联。 

def digui(n):
    if n == 1:return 1
    return n*digui(n-1)
for i in range(1,6):
    print(i,'!=',digui(i))
#运行结果:
1 != 1
2 != 2
3 != 6
4 != 24
5 != 120

嵌套函数

def printTest(isNan,name,age):
    def inner(a,b):
        print("{0} is {1}".format(a,b))

    if isNan ==True:
        inner(name,age)
    else:
        inner(age,name)
printTest(True,'张三',18)
printTest(False,'静静',18)
#运行结果:
张三 is 18
18 is 静静

变量

1.变量的作用域(全局变量,局部变量)

全局变量:

a. 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。

b.全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。

c.全局变量一般做常量使用。

d.函数内要改变全局变量的值,使用 global 声明一下

局部变量:

a. 在函数体中(包含形式参数)声明的变量。

b. 局部变量的引用比全局变量快,优先考虑使用。

c. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量 

a = 123
def change():
    global a  #在方法中要修改全局变量,必须要加global,要不然就报错了
    print(a)
    a = 300
change()
print(a)
#运行结果:
123
300

参数

本质

函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”, 所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不 是“值传递”。具体操作时分为两类:

1. 对“可变对象”进行“写操作”,直接作用于原对象本身。

2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填 充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)

可变对象有:
  字典、列表、集合、自定义的对象等

不可变对象有: 数字、字符串、元组、function 等 

分类

1.位置参数

函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,称为: “位置参数” 

def add(a,b,c):
    print(a+b+c)

add(1,2,4)
add(1,2)

运行结果:

7
Traceback (most recent call last):
File "/Users/gray/PycharmProjects/test/test004.py", line 7, in <module>
add(1,2)
TypeError: add() missing 1 required positional argument: 'c'

2.默认参数

我们可以为某些参数设置默认值,这样这些参数在传递时就是可选的。称为“默认值参数”。 默认值参数放到位置参数后面。 

def add(a,b=10,c=20):
    print(a+b+c)

add(1)  #1+10+20=31
add(1,2) #1+2+20=23

3.命名参数

我们也可以按照形参的名称传递参数,称为“命名参数”,也称“关键字参数 

def add(a,b,c):
    print(a+b+c)
add(c=10,a=2,b=20) #10+2+20=23

4.可变参数

可变参数就是可变数量的参数

a. *param(一个星号),将多个参数收集到一个“元组”对象中。

b. **param(两个星号),将多个参数收集到一个“字典”对象中。

def add1(a,b,*c):
    print(a,b,c)
def add(a,b,**c):
    print(a,b,c)
add1(1,2,4,5,6,7,8)
add(1,2,name='kang',age=18)
# 运行结果:
1 2 (4, 5, 6, 7, 8)
1 2 {'name': 'kang', 'age': 18}
def print_info(*a,**c):
    print("name : %s" %(a))
    print('a',a)
    print('c',c)
    for i in c:
        print("%s : %s" %(i,c[i]))
print_info("kang",job='IT',age=12,height=176)
#运行结果:
name : kang
a ('kang',)
c {'job': 'IT', 'age': 12, 'height': 176}
job : IT
age : 12
height : 176

def add(*args):
    print(args)
    sum = 0
    for i in args:
        sum += i
    print(sum)
add(1,2,3,4,5)  #15

5.强制命名参数

在带星号的“可变参数”后面增加新的参数,必须在调用的时候“强制命名参数” 

def add(*a,b,c):
    print(a,b,c)
add(1,2,4,5,6,b=7,c=8)  #(1, 2, 4, 5, 6) 7 8
add(1,2,4,5,6,7,8)  #TypeError: add() missing 2 required keyword-only arguments: 'b' and 'c  由于 a 是可变参数,将值全部收集。造成 b 和 c 没有赋值
原文地址:https://www.cnblogs.com/elephant-study/p/11890877.html