Python基础-函数[1]

简单函数的定义

def 关键字定义函数

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python

def func_name():             # def关键字定义函数
    print "hello world"

func_name()    #调用所定义的函数


========结果=====
root@tonglele /mnt # python fun.py 
hello world

局部变量和全局变量

作用域: 变量生效的范围
局部变量: 在某一函数内定义的变量,作用域为此函数体
全局变量: 定义在函数之外,作用域为整个模块,如果要在函数体内使用则使用global关键字标记
全局变量尽量少用。但有些配置性的信息可以设置为全局变量方便使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(局部变量与全局变量)
#!/usr/bin/env python

a = 5               #这里的a为全局变量
def func_name():
    a = 'hello'    #这个a为局部变量,它的作用域为此函数
    print a

func_name()   #调用函数
print a   #这里打印的为全局变量a

========结果========
root@tonglele /mnt # python fun.py
hello
5


(global关键字)
#!/usr/bin/env python

a = 5
def func_name():
    global a            #这里使用global关键字定义a是全局变量a,在这个函数体内所有对a的赋值操作都是对全局变量a的改变
    a = 'hello'
    print a

func_name()
print a

==========结果=======
root@tonglele /mnt # python fun.py
hello
hello


(在函数体内可以直接调用全局变量)
#!/usr/bin/env python

a = 5
def func_name():
    print a

func_name()
print a

=======结果=======
root@tonglele /mnt # python fun.py
5
5

带不可变参数的函数

在调用函数时传入一个或多个参数,函数体接收之后作出相应工作。

1
2
3
4
5
6
7
8
9
10
11
(传入一个参数)
#!/usr/bin/env python

def func_name(arg):  #arg 形参
    print arg      #arg作为参数传进来,相当于一个局部变量

func_name('hello tonglele')   #'hello tonglele'就是实参,是在调用函数时传给函数的参数

=======结果=======
root@tonglele /mnt # python fun.py
hello tonglele

传入多个参数

位置参数

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python

def func_name(arg1,arg2):      #arg1,arg2为两个形参,中间用‘,’隔开
    print arg1+arg2      #打印arg1+arg2的结果

func_name(1,2)   #在调用函数时传入两个时参,中间用逗号隔开,需要注意的是顺序要按照所调用的函数定义的顺序
========结果======
root@tonglele /mnt # python fun.py
3

关键字参数

1
2
3
4
5
6
7
8
9
10
11
12
 
#!/usr/bin/env python

def func_name(arg1,arg2):
    print arg1
    print arg2

func_name(arg2=1,arg1=2)    #在关键字传参时顺序就不那么重要了,但需要把参数名与值一一对应好
=======结果======
root@tonglele /mnt # python fun.py
2
1

关键字参数和位置参数混合使用

1
2
3
4
5
6
7
8
9
 
#!/usr/bin/env python

def func_name(arg1,arg2,arg3):
    print arg1
    print arg2
    print arg3

func_name(1,arg3=2,arg2=5)   #位置参数必须在关键字参数之前,否则会出现语法错误。eg:SyntaxError: non-keyword arg after keyword arg

默认参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python

def func_name(arg1,arg2,arg3=3):   #给arg3一个默认值,如果在调用此函数时未给arg3传值,则取默认值3
    print arg1
    print arg2
    print arg3

func_name(1,2)     #此时未给arg3传参
==========结果========
root@tonglele /mnt # python fun.py
1
2
3

#!/usr/bin/env python

def func_name(arg1,arg2,arg3=3):    #在函数定义的时候,带默认值的参数必须放在不带默认值参数的后边。
    print arg1
    print arg2
    print arg3

func_name(1,2,5)    #此时给arg3传参,默认值将被覆盖
=======结果======
root@tonglele /mnt # python fun.py
1
2
5

带可变参数的函数

在Python中支持可变参数,即你可以传入0或多个参数,对参数的个数没用固定的要求

可变位置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#!/usr/bin/env python

def func_name(*args):
    print type(args)
    for x in args:
        print x

func_name(1,2,5,'hello','tonglele')
=======结果=======
root@tonglele /mnt # python fun.py
<type 'tuple'>     #我们可以看出函数将传进来的参数打包成了一个元组
1
2
5
hello
tonglele

可变关键字参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#!/usr/bin/env python

def func_name(**kwargs):
    print type(kwargs)
    for k,v in kwargs.items():
        print "%s  ==>  %s" % (k,v)

func_name(name='tonglele',age='19',school='XAUT')
===========结果===========
root@tonglele /mnt # python fun.py
<type 'dict'>   #函数将传进去的变量打包成一个字典
age  ==>  19
name  ==>  tonglele
school  ==>  XAUT

非可变参数与可变参数的结合

非可变参数必须要在可变参数之前
可变位置参数要在关键字参数之前

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#!/usr/bin/env python

def func_name(arg1,arg2,*args):
    print arg1
    print arg2
    print args

func_name(1,2,3,4,5,5)
=======结果=======
root@tonglele /mnt # python fun.py
1
2
(3, 4, 5, 5)

参数解包

* 用于解包序列为位置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#!/usr/bin/env python

def func_name(arg1,arg2,arg3):
    print arg1
    print arg2
    print arg3

li = [1,2,3]
func_name(*li)    #将一个列表解包传递进去
=======结果======
root@tonglele /mnt # python fun.py 
1
2
3

** 用于解包字典为关键字参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#!/usr/bin/env python

def func_name(arg1,arg2,arg3):
    print arg1
    print arg2
    print arg3

dic = {'arg1':1,'arg2':2,'arg3':3}
func_name(**dic)    #将一个字典解包传递进去
======结果======
root@tonglele /mnt # python fun.py
1
2
3

函数返回值

主要使用return关键字
可以返回任何对象
python中以元组的形式可以返回多个值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#!/usr/bin/env python

def func_name(arg1,arg2):
    arg3 = arg1 + arg2
    arg4 = arg1 * arg2
    return arg3,arg4

i,j = func_name(2,3)
print i
print j
===========结果===========
root@tonglele /mnt # python fun.py
5
6

python中的递归函数

递归:函数直接或间接调用自身的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#!/usr/bin/env python

def func_name(n):
    if n<= 1:
        return 1
    else:
        return n * func_name(n - 1)

answer = func_name(10)
print answer
=========结果=======
root@tonglele /mnt # python fun.py      
3628800      #即计算10的阶乘    #shell中一条命令计算阶乘:seq -s \* 1 10 | bc

python 中函数递归的最大深度为1000,所以要尽量避免使用递归,可是使用迭代代替:

1
2
3
4
5
6
7
8
9
10
11
 
#!/usr/bin/env python

def func_name(n):
    answer = 1
    for x in range(1,n,1):
        answer *= x
    return answer

answer = func_name(1001)
print answer

函数作为参数

在python中函数也可以当作参数,可以作为函数的返回值函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#!/usr/bin/env python

def fun1():
    print "calling fun1"

def fun2(f):
    print "calling fun2"
    f()

fun2(fun1)
=========结果======
root@tonglele /mnt # python fun.py 
calling fun2
calling fun1

高阶函数

在python中以函数作为参数的函数叫做高阶函数
下面介绍三个内置的高阶函数

filter函数

filter:filter(function or none,seq)
可以看作是一个过滤函数 当函数返回值为true时,会将当前值加进序列
简单的使用:

1
2
3
4
5
6
7
8
9
10
11
12

#!/usr/bin/env python

li = [0,1,2,3,4,5,6,7,8,9,10]

def fun(x):
    return x % 2 == 0

print filter(fun,li)
===========结果=======
root@tonglele /mnt # python fun.py 
[0, 2, 4, 6, 8, 10]  #类似于列表解析

自己用代码实现filter函数的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#!/usr/bin/env python

li = [1,2,3,4,5,6,7,8,9,10]

def afilter(f,li):
    li1 = []
    for i in li:
        if f(i):
            li1.append(i)
    return li1

def fun(x):
    return x % 2 == 0

print afilter(fun,li)
=======结果======
root@tonglele /home/tyj/Desktop/Python1[基础]/code/6-5 # python filter.py
[2, 4, 6, 8, 10]

map函数

map:map(function or none,seq)
对列表中的所有元素执行一个函数
简单使用map函数:

1
2
3
4
5
6
7
8
9
10
11
12
 
#!/usr/bin/env python

li = [0,1,2,3,4,5,6,7,8,9,10]

def fun(x):
    return x ** 2

print map(fun,li)
==========结果==========
root@tonglele /mnt # python fun.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

自己用代码实现map函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#!/usr/bin/env python

li = [1,2,3,4,5,6,7,8,9,10]

def mymap(f,li):
    li1 = []
    for i in li:
        li1.append(f(i))
    return li1

def fun(x):
    return x ** 2

print mymap(fun,li)
=========结果=======
root@tonglele /home/tyj/Desktop/Python1[基础]/code/6-5 # python map.py   
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

reduce函数

reduce:reduce(function,seq)
先对进来的列表中的前两个元素进行function操作,得到的结果再与第三个元素一起进行function操作,所以function一定要是一个二元操作函数
简单使用reduce函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#!/usr/bin/env python

li = [0,1,2,3,4,5,6,7,8,9,10]

def comp(x,y):
    if x >= y:
        return x
    else:
        return y

print reduce(comp,li)
=======结果======
root@tonglele /mnt # python fun.py
10

自己用代码实现reduce:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#!/usr/bin/env python

li = [1,4,5,7,13,7,8,9,10]

def myreduce(f,li):
    answer = li[0]
    li_len = len(li)
    for index in  range(1,li_len):
        answer = f(answer,li[index])
    return answer

def comp(x,y):
    if x <= y:
        return y
    else:
        return x

print myreduce(comp,li)
=========结果=======
root@tonglele /home/tyj/Desktop/Python1[基础]/code/6-5 # python reduce.py
13

用自己实现的reduce 选取出一大组数中最大的两个:
先将一大组数划分为几个小块
选取出每个小块中最大的两个
再选取出原来的那个一大组数中的最大的两个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#!/usr/bin/env python

li = [[1,4,5],[7,13,7],[8,9,10]]


def myreduce(f,li):
    answer = li[0]
    li_len = len(li)
    for index in  range(1,li_len):
        answer = f(answer,li[index])
    return answer

def find_b(li1,li2):
    li1.sort()
    li2.sort()
    li = []
    for i in range(2):
        li.append(li1.pop())
        li.append(li2.pop())
    li.sort()
    li = li[len(li) - 2:len(li)]
    return li

print myreduce(find_b,li)
===========结果========
root@tonglele /home/tyj/Desktop/Python1[基础]/code/6-5 # python reduce++.py
[10, 13]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值