函数的定义和调用
函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。
1 | def sayHi(): #无参函数的定义,且没有返回值。函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。 |
输出为:1
2
你好我是王尼玛
1 | def squareSum(a,b): #带形参的函数定义(a,b即为形参) |
输出为:1
13
带默认形参的函数
我们可在定义形参的时候直接给参数加一个默认值。值得注意的是带有默认值的形参要放在右边。比如“def say(message, times = 1):”是正确的而“def say(times=1,message):”是错误的!1
2
3
4
5def say(message, times = 1):
print ((message+" ") * times) #字符串可以通过+号连接
say('Hello')
say('World', 3)
输出结果1
2Hello
World World World
关键参数赋值
再调用函数的时候,我们可以直接通过形参名给形参赋值1
2
3
4
5
6def func(a, b=2, c=3):
print ("a、b、c的值分别为",a,b,c)
func(1,3)
func(1, c=24)
func(c=50, a=100)
输出1
2
3a、b、c的值分别为 1 3 3
a、b、c的值分别为 1 2 24
a、b、c的值分别为 100 2 50
文档字符串❤
在函数的第一个逻辑行的字符串是这个函数的 文档字符串 。注意,DocStrings也适用于模块和类(虽然还没学到那…..委屈)。文档字符串主要用于给函数示意。1
2
3
4
5
6
7
8def sayHi():
""" 这个函数的作用是王尼玛勾搭妹子问候语""" #只能通过三引号的行出,用井号不行
"""本条语句也是不能作为函数字符串的!"""
print("你好我是王尼玛")
sayHi()
print(sayHi.__doc__) #函数名后不需要括号,doc两边的是双下划线
help(sayHi) #内置的help函数其实就是读取的doc
输出1
2
3
4
5
6你好我是王尼玛
这个函数的作用是王尼玛勾搭妹子问候语
Help on function sayHi in module __main__:
sayHi()
这个函数的作用是王尼玛勾搭妹子问候语
局部变量
定义在函数内部的变量叫做局部变量,不管局部变量的值在函数内部如何变化,都不会影响到函数外的同名变量。即变量名称对于函数来说是局部 的。这称为变量的作用域 。所有变量的作用域是它们被定义时所在的块。
1 | a = 1 |
输出结果:1
2函数返回值为 2
a的值为 1
4.使用global语句
如果你想要在函数外为一个定义在函数内的变量赋值,那么你就得通过global语句告诉Python这个变量名不是局部的,而是全局的。1
2
3
4
5
6
7
8
9
10def func():
global x
print ("函数中x的值为",x)
x = 2
return x
x = 50 #在函数外为一个定义在函数内的变量赋值
print ('x的值为', x)
print("函数返回值为",func())
输出结果
1 | x的值为 50 |
lambda函数
lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:1
2
3
4
5
6
7def f(x):
return x**2
print (f(4))
#Python中使用lambda的话,写成这样
g = lambda x : x**2
print (g(4))
lambda生成一个函数对象。该函数参数为x,,返回值为x的平方。函数对象赋给g。g的调用与正常函数无异。
函数作为参数传递
函数可以作为一个对象,进行参数传递。函数名(比如func)即该对象。比如说:1
2
3
4
5
6
7
8def f(x):
return x**2
def test(fx, a): #将函数作为参数传递
print ('%d的平方为' % a,end="")
print (fx(a))
test(f, 4)
上面的程序可以改写为1
2
3
4
5def test(fx, a):
print ('%d的平方为' % a,end="")
print (fx(a))
test(lambda x:x**2, 4)
map()函数
map函数的定义:
map(function, sequence[, sequence, …]) -> list
通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个集合。map()将每次从两个表中分别取出一个元素,带入lambda所定义的函数。1
print(list(map(lambda x: x ** 2, (1, 2, 3, 4, 5))))
输出1
[1, 4, 9, 16, 25]
1 | print(list(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))) |
输出1
[3, 7, 11, 15, 19]
filter()函数
filter函数的第一个参数也是一个函数对象。它也是将作为参数的函数对象作用于多个元素。如果函数对象返回的是True,则该次的元素被储存于返回的表中。filter通过读入的函数来筛选数据。同样,在Python 3.X中,filter返回的不是表,而是循环对象。1
2
3
4
5
6
7def func(a):
if a > 100:
return True
else:
return False
print (list(filter(func,[10,56,101,500])))
小提示:
指针传递使函数可以改变函数外的值!
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)
但是对于列表来说,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递)
1
2
3
4
5
6
7
8b = [1,2,3]
def changeList(b): #我们将一个表传递给函数,函数进行操作,原来的表b发生变化。
b[0] = b[0] + 1
return b
print ("函数返回值为",changeList(b))
print ("b的值为",b)
输出结果:1
2函数返回值为 [2, 2, 3]
b的值为 [2, 2, 3]
Python可以返回多个值,以元组的形式返回
1
2
3
4
5
6
7def idSave():
a=input("姓名为:")
b=input("年龄为:")
c=input("性别为:")
return a,b,c
print(idSave())
输出结果:1
2
3
4姓名为:王尼玛
年龄为:12
性别为:女
('王尼玛', '12', '女')
带有默认值的形参
我们可在定义形参的时候直接给参数加一个默认值。值得注意的是带有默认值的形参要放在右边。