函数的定义

def hello():
    print("hello ITFun")

hello()

参数

# 我是电视
def tv(x) :
    print("您要看的是" + x + "台!")

# 我是遥控器,我想看12台
tv(12)
def test(a, b):
    print("a是" + a + ",b是" + b)

test("热干面", "三鲜豆皮")
  • 定义时小括号中的参数,用来接收参数用的,称为 “形参”
  • 调用时小括号中的参数,用来传递给函数用的,称为 “实参”

默认值

def test(a, b="糊汤粉"):
    print("a是%s,b是%s" % (a, b))


test("热干面")
def test(a="热干面", b="糊汤粉"):
    print("a是%s,b是%s" % (a, b))


test(b="三鲜豆皮")
def test(a="热干面", b):
    print("a是%s,b是%s" % (a, b))


test(b="三鲜豆皮")
# 报错
  • 在形参中默认有值的参数,称之为缺省参数
  • 注意:带有默认值的参数一定要位于参数列表的最后面

可变参数

格式

def name([formal_args,] *args, **kwargs):
   pass

args

加了 * 的变量 args 会存放所有未命名的变量参数,args 为元组。

def test(*args):
    print(args)
    print(args[0])

test("热干面", "三鲜豆皮", "糊汤粉")

kwargs

加了 ** 的变量 kwargs 会存放命名参数,即 key=value 的参数, kwargs 为字典。

def test(**kwargs):
    print(kwargs)
    for key, value in kwargs.items():
        print("key=%s" % value)


test(x="热干面", y="三鲜豆皮", z="糊汤粉")

多个不定长参数

如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args 的后面。 但如果有 **kwargs 的话,**kwargs 必须是最后。

def test(a, *args, b=22, c=33, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)

test(100, 200, 300, b=222, c=333, x=1000, y=2000)

作用域

局部变量

  • 局部变量,就是在函数内部定义的变量
  • 其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的
def test():
  a = "hello"

test()
print(a)

全局变量

  • 在函数外面定义的变量叫做全局变量
  • 全局变量能够在所有的函数内访问
a = "hello"

def test():
    print(a)

test()

全局与局部变量同名

a = "hello"

def test():
    a = "hi"
    print(a)

test()
print(a)

修改全局变量

a = "hello"

def test():
    global a
    a = "hi"
    print(a)

test()
print(a)

返回值

def test(a):
    return "你输入的是:" + a

result = test("good")
print(result)
def test():
    print("---1---")
    return 111

    print("---2---")
    return 222

result = test()
print(result)
def test():
    return 100, 200

result = test()
print(result)
  • 只要碰到 return,之后代码就都不再运行了
  • 如果 return 后面有多个数据,则默认是返回元组

拆包

def test():
    return 100, 200


x, y = test()
print(x)
print(y)
  • 拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常
  • 除了对元组拆包之外,还可以对列表、字典等拆包
a, b = (10, 20)
a, b = [10, 20]
a, b = {"x":10, "y":20}     # 取出的是key

交换变量的值

a = 10
b = 20
c = 0

c = a
a = b
b = c

print(a)
print(b)
a, b = 10, 20
a, b = b, a
print(a)
print(b)

递归

递归函数就是在函数里,自己调用自己的函数。

def recursion(x):
    print(x)

    if x < 30:
        recursion(x + 1)


recursion(1)

匿名函数

省略了用 def 声明函数的步骤

语法:

lambda [arg1 [,arg2,.....argn]]:expression

示例:

sum = lambda num1, num2: num1 + num2
print("值是 : %s" % sum(10, 20))
def test(a, b, opt):
    return opt(a, b)


result = test(10, 20, lambda x, y: x + y)
print(result)
  • lambda 函数能接收任何数量的参数,但只能返回一个表达式的值
  • 匿名函数不能直接调用print,因为 lambda 需要一个表达式