python学习笔记05----函数

函数的定义和调用

函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。

1
2
3
def sayHi():                  #无参函数的定义,且没有返回值。函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。  
print("你好我是王尼玛") #注意缩进
sayHi() #函数调用

输出为:

1
2
>>>   
你好我是王尼玛

1
2
3
4
def squareSum(a,b):            #带形参的函数定义(a,b即为形参)  
c = a**2 + b**2 #a**2表示a的平方
return c #将c的值返回,与java不同的是,Python可以返回多个值,且以元组的形式返回
print(squareSum(3,2)) #函数调用,将数值3,2带入函数

输出为:

1
13

带默认形参的函数

我们可在定义形参的时候直接给参数加一个默认值。值得注意的是带有默认值的形参要放在右边。比如“def say(message, times = 1):”是正确的而“def say(times=1,message):”是错误的!

1
2
3
4
5
def say(message, times = 1):  
print ((message+" ") * times) #字符串可以通过+号连接

say('Hello')
say('World', 3)

输出结果

1
2
Hello   
World World World

关键参数赋值

再调用函数的时候,我们可以直接通过形参名给形参赋值

1
2
3
4
5
6
def 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
3
a、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
8
def 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
2
3
4
5
6
7
8
a = 1  

def changeNum(a): #整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化。
a = a + 1
return a

print ("函数返回值为",changeNum(a))
print ("a的值为",a)

输出结果:

1
2
函数返回值为 2  
a的值为 1

4.使用global语句

如果你想要在函数外为一个定义在函数内的变量赋值,那么你就得通过global语句告诉Python这个变量名不是局部的,而是全局的。

1
2
3
4
5
6
7
8
9
10
def func():  
global x

print ("函数中x的值为",x)
x = 2
return x

x = 50 #在函数外为一个定义在函数内的变量赋值
print ('x的值为', x)
print("函数返回值为",func())

输出结果

1
2
3
x的值为 50  
函数中x的值为 50
函数返回值为 2

lambda函数

lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:

1
2
3
4
5
6
7
def 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
8
def f(x):  
return x**2

def test(fx, a): #将函数作为参数传递
print ('%d的平方为' % a,end="")
print (fx(a))

test(f, 4)

上面的程序可以改写为

1
2
3
4
5
def 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
7
def func(a):  
if a > 100:
return True
else:
return False

print (list(filter(func,[10,56,101,500])))

小提示:

  1. 指针传递使函数可以改变函数外的值!

    对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)

    但是对于列表来说,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递)

    1
    2
    3
    4
    5
    6
    7
    8
    b = [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]

  1. Python可以返回多个值,以元组的形式返回

    1
    2
    3
    4
    5
    6
    7
    def idSave():  
    a=input("姓名为:")
    b=input("年龄为:")
    c=input("性别为:")
    return a,b,c

    print(idSave())

输出结果:

1
2
3
4
姓名为:王尼玛  
年龄为:12
性别为:女
('王尼玛', '12', '女')

  1. 带有默认值的形参

    我们可在定义形参的时候直接给参数加一个默认值。值得注意的是带有默认值的形参要放在右边。