Python简明教程(二)函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gavinsun/article/details/77925499

Python简明教程(二)函数

Python中的函数

如果你学过C、Java等其它编程语言,那么Python中的函数就不用多说了,因为你太熟悉了,不是吗?
如果你什么语言都没学过,那么请先自行搜索一下什么是函数。其实,Python中的函数和数学中的函数很相似,只是数学中的函数常用来处理数学问题,而Python中的函数除了能处理数学问题,还能处理很多其它问题。

数学中的函数:

f(x,y) = x + y  #数学定义函数
f(2,3) = 2 + 3 = 5  #数学中是这样使用函数的

Python中的函数:

def f(x,y):
    return x + y
z =f(2,3)  # Python中这样使用函数,“python”会自动把(2,3)带入定义的函数,并把计算结果通过return返回,这里是把返回的结果“保存到z中”
print z

一个函数是一个有组织的、可重复使用的代码块,用于执行单个相关操作。 当解决一个问题需要写很多代码时,函数可以使解决问题的过程模块化,模块可以重复重用。

关于返回值return

  1. 在Python中,f(x,y)中的(x,y)是函数的参数,当调u用函数时,如果需要获得函数的结果,请使用return;
  2. 执行return语句时,程序将立即返回到调用函数的地方;
  3. 如果函数中没有任何return语句,函数将默认返回None;

函数参数

参数的传递

def add(x,y):
    result = x + y
    return result
z = add(2,3) #执行这行代码时,2,3会传递给add函数中的x,y,返回的结果会保存到z中。
a,b = 10,20 #执行这行代码时,10,20会分别赋值给a,b
c = add(a,b) #执行这行代码时,a,b会分别传递给add函数中的x,y中,函数的返回值将被赋值给c

默认参数

例如,我们有一个OA办公系统,系统中有个添加员工的功能,由于公司90%招聘的是美女,所以添加员工时,设置的默认参数是‘女’,以下是函数“添加”的伪代码:



def 添加(姓名,年龄,性别='女'):
    保存(姓名,年龄,性别)

添加('lucy',18)  #添加一个女员工时,由于默认参数是'女',所以性别参数可以省略
添加('lily',18)
添加('Gavin',18,'男') #添加一个男员工时,由于默认参数是'女',所以性别参数需要重新指定。

定义函数时可以指定默认参数,需要注意的是,默认参数必须放在非默认参数的后面,例如:

#错误的
def f(a,b=2,c):  #SyntaxError: non-default argument follows default argument
    pass

#正确的
def f(a,c,b=2):
    pass

调用函数时可以指定关键参数,需要注意的是关键参数必须放在非关键参数后面,例如:

def f(a,b,c):
    print(a,b,c)

f(1,2,3) #输出结果是1 2 3
f(c=3,a=1,b=2) #输出结果是 1 2 3
f(1,2,c=3) #输出结果是 1 2 3
f(1,c=3,2) # SyntaxError: non-keyword arg after keyword arg

*args 和 **kwargs

需要说明的是args和kwargs不是必须的,和*才是其重点。如果你愿意,你可以使用*x,**y等。

*args的用法

在定义函数时,当你不知道需要定义多少个参数时,请使用*args,例如:

def test_args(a,*args):
    print("第一个参数是:{first_arg}".format(first_arg=a))
    print("其余的参数是:{other_args}".format(other_args=args))
test_args(1,2,3,4,5)

上述代码,运行结果如下:
第一个参数是:1
其余的参数是:(2, 3, 4, 5)

使用*args时,*args将把收到的多余的参数作为一个元组看待。

**kwags的用法

在定义函数时,如果您不知道将会用到多个关键字参数,请使用**kwags。

def get(url,**kwargs):
    print("第一个参数url的值是:{first_arg}".format(first_arg=url))
    print("其余关键参数的值是:{other_keyword_arg}".format(other_keyword_arg=kwargs))

** kwags将把收到的多余的关键参数放在一个dict中。

变量的作用域

在我们所在的星球上,每个对象都是有作用域的。如果你站在宿舍喊老师,老师是听不到的,因为老师和你不在一个范围里。而“天空”的作用域是全球(Global)可见的,因为天空的作用域太大了,而你的作用域太小了。

在Python代码中也是这样,每个变量都是有作用域的。全文件可见的变量叫global变量(全局变量),其它变量我们成为local变量(局部变量)。

什么可以影响变量的作用域?

函数(def or lamda)、类(class)能印象作用域,而if、for、while不能影响作用域。例如:

#for
for i in [1,2,3,4,5]:
    print i,

i = i + 10
print "i is:",i

# if
if True:
    x = 3
x = x +100
print x

上述代码的运行结果如下:

1 2 3 4 5 i is: 15
103

全局变量和局部变量

在Python中,定义在模块最顶级的变量称之为全局变量,定义在函数或class内的叫局部变量。不过有个例外,就是使用global修饰的变量也是全局变量。例如:

#global_arg_test.py
x = 1  # 这是全局变量

def test_local():
    x = 2 # 这是局部变量,和上述x = 1中的x不一样
test_local() #调用test_local函数
print x  # x的值仍然是1,并不受test_local函数的影响。


def test_global():
    global x  #这里的x是全局变量,和上述的x=1中的x一样
    x = 100  # 这里把全局变量x的值修改为100
test_global() #条用test_global函数
print x #输出结果是100,这是因为x的值被函数test_global修改了。

关于函数中的变量: 函数中的变量只在函数内部能用,在函数外部不能用,若想在函数外部使用函数内的变量,需要在定义变量时使用global语句修饰。
全局变量影响的是整个文件,局部变量影响的只是局部。

全局变量的使用

  1. 全局变量有时候可以用来缓存数据;
  2. 使用过多的全局变量会破获程序的可维护性,且用且谨慎;

内置函数

在Python中,默认提供了很多有用的内置函数,例如:dir、type、help、map等都是Python中的内置函数。更多内置函数请参考:
https://docs.python.org/2.7/library/functions.html

匿名函数

所谓匿名函数就是没有函数名的函数。在Python中,使用lambda表达式来定义匿名函数。

注意:匿名函数可以当做表达式来使用

#一个普通的函数
def f(x):#
    return 2 * x
print f(3)  #输出结果是6

#匿名函数的写法如下:
y = lambda x:2*x 
print y(3) #输出结果是6

高阶函数

高阶函数就是把函数当做参数传递的函数,例如:

def f(func,x,y): #这就是Gavin自己定义的一个高阶函数
    return func(x,y)

def add(x,y):
    return x + y 

print f(add,1,2)

当然,上述代码定义的一个高阶函数只能说明一下原理,体现不了高阶函数的用处,我们将在下个章节见识高阶函数的妙用。

当高阶函数遇见匿名函数

上面两节,我们知道了什么是高阶函数,什么是匿名函数。那么,当当高阶函数遇见匿名函数时会擦出怎样的火花呢?

map遇见lambda

关于map
map是Python内置的一个高阶函数,它有两个参数,第一个参数是一个函数,第二个参数是一个可迭代对象。map将函数应用于可迭代的对象中的每个元素并返回结果列表。 可迭代参数可以是序列或任何可迭代对象,而起返回结果总是一个列表。


f = map(lambda x:x*5,range(1,11))
print f

上述代码的输出结果是:

[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

我们在来一个稍微复杂点的:

print "\n".join(map(lambda x:" "*(2*5-2*x) + (x + 1)*"love",[0,2,4,5,5,4,3,2,1,0]    ))

上述代码的运行结果是:

      lovelovelove
  lovelovelovelovelove
lovelovelovelovelovelove
lovelovelovelovelovelove
  lovelovelovelovelove
    lovelovelovelove
      lovelovelove
        lovelove
          love

map遇见lamdba,会让代码更简单,会让人间充满爱!

reduce遇见lambda

reduce()将两个参数的函数累加到可迭代对象中的每每个元素,以便将迭代值减少为一个值,例如:

print reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
# 计算过程是这样的:((((1+2)+3)+4)+5)

猜你喜欢

转载自blog.csdn.net/gavinsun/article/details/77925499
今日推荐