一、什么是函数
函数是可被调用的,可重复使用的,用来实现单一,或相关功能的代码段。
函数的作用:
- 减少重复代码,提高应用的模块性
- 保持代码的一致性
- 增删改代码一次搞定,简单粗暴,更易扩展
一、创建函数
1、定义一个函数的规则
- 函数代码块以def关键字开头,后接函数标识符名称和()
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
- 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明
- 函数内容以冒号起始,并且缩进
- return[表达式]结束函数,选择性返回一个值给调用方。如果没有return,则相当于返回None
语法:
1
def
函数名 (参数列表)
2 函数体
2、形参和实参
形参:虚拟变量,在定义函数和函数体的时候使用形参。目的是在函数调用时接收实参,实参个数、类型要与形参一一对应。
实参:调用函数时传给函数的参数。可以是常量、变量、表达式、函数。
形参不占用内存空间,形参变量只有在被调用时才分配内存单元。
1
import
time
2
def
action1(n):
3
print(‘Start action 1.‘)
4 logger(n)
5def action2(n):
6print(‘Start action 2.‘)
7 logger(n)
8def action3(n):
9print(‘Start action 3.‘)
10 logger(n)
11def logger(n):
12 time_format = ‘%Y-%m-%d %X‘13 time_current = time.strftime(time_format)
14 with open(‘日志记录‘,‘a‘) as f:
15 f.write("%s End action %s.n"%(time_current,n))
16 action1(10)
17 action2(20)
18 action3(30)
3、函数的参数
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
- 无命名参数
- 有命名参数
必需参数
必需参数在调用和声明时的数量及顺序必须保持一致。
关键字参数
函数调用时使用关键字参数来确定传入的参数值,按照参数名匹配参数值,使用关键在参数允许含在在调用时参数的顺序与声明时不一致。
默认参数
定义函数时,设定默认参数。当调用函数时,缺省参数如果没有值传入,则使用默认参数设定的值。
1
def print_info(name,age,sex=‘male‘):
23print(‘Name:%s‘%name)
4print(‘age:%s‘%age)
5print(‘Sex:%s‘%sex)
6return78 print_info(‘alex‘,18)
9 print_info(‘铁锤‘,40,‘female‘)
不定长参数
例1:
1
def add(*args):
2print(‘args:‘,args)
3 sum = 0
4for i in args:
5 sum += i
6return sum
7print(‘sum:‘,add(1,2,3,4,5))
输出:
args: (1, 2, 3, 4, 5)
sum: 15
例2:
1
def print_info(**kwargs):
2print(‘kwargs:‘,kwargs)
3 sum = 0
4for i in kwargs:
5print(‘%s:%s‘ % (i, kwargs[i]))
67 print_info(name=‘oliver‘,age=20,sex=‘female‘)
输出:
kwargs: {‘name‘: ‘oliver‘, ‘age‘: 20, ‘sex‘: ‘female‘}
name:oliver
age:20
sex:female
*args用元组接收传入的参数,**kwargs用字典接收传入的键值对。
4、return
return的作用:
(1)结束函数
(2)返回某个对象
注意点:
如果不加return,默认返回None。
如果return有个对象,那么会将多个对象封装成一个元组。
遇到return语句,就会停止执行并返回结果。
5、函数的作用域
L:local,局部作用域
E:enclosing,函数嵌套作用域
G:global,全局作用域
B:built_in,python内置作用域
查找顺序:L→E→G→B
global关键字:
例:(将local作用域中的变量声明为global作用域)
1 count = 10
2def outer():
3global count #打印前需先定义count的作用域4print(count) #local variable ‘count‘ referenced before assignment5 count = 100
6print(count)
7 outer()
nonlocal关键字:
例:(将local作用域中的变量声明为enclosing作用域)
1
def
outer():
2 count = 10
3def inner():
4 nonlocal count #先声明为enclosing作用域5 count = 20
6print(count)
7 inner()
8print(count)
9 outer()
在局部作用域,不能修改全局作用域的变量。
在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的
6、高阶函数
将函数名作为实参传给另一个函数使用。
1
def
f(n):
2
return n*n
3def foo(a,b,func):
4return func(a)+func(b)
5print(foo(1,2,f))
输出: 5
函数不仅可以赋值,也可以作为函数的参数,还可以作为函数的返回值。
7、递归函数
用递归函数实现打印斐波那契数列:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
前两项分别为:0和1,从第三项开始每一项是前两项之和,因此可得:f(n) = f(n-1) + f(n-2)
1
def
fibo(n):
2
if n <= 2:
3return n - 1
4return fibo(n-1)+fibo(n-2)
56print(fibo(8))
输出: 13
递归函数特性:
- 调用自身函数
- 有一个结束条件
需要注意的是,凡是能用递归解决的问题,通过循环都可以解决,并且递归的效率比较低,一般只能递归998次,超出会报错。
8、内置函数
eval()
eval()函数不仅可以将字符串转换为字典,还可以作为计算机使用。
1
print(eval(‘1+3/8*9‘))
输出: 4.375
下面是几个非常重要的内置函数:
filter(function, sequence)
1 str = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
2def fun1(s):
3if s != ‘a‘:
4return s
5 ret = filter(fun1, str)
6print(list(ret)) # ret是一个迭代器对象
输出: [‘b‘, ‘c‘, ‘d‘]
map(function, sequence)
1 str = [‘hello‘, ‘a‘, ‘b‘]
2def fun2(s):
3return s + "alvin"4 ret = map(fun2, str)
5print(ret) # map object的迭代器6print(list(ret))
输出:
<map object at 0x7f382ca0aba8> [‘helloalvin‘, ‘aalvin‘, ‘balvin‘]
reduce(function, sequence, starting_value)
1
from functools import reduce
2def add1(x, y):
3return x + y
4print(reduce(add1, range(1, 101))) ## 4950 (注:1+2+...+99)56print(reduce(add1, range(1, 101), 20)) ## 4970 (注:1+2+...+99+20)
输出:
5050 5070
lambda
1
def
add(a,b):
2
return a + b
34print add(2,3)
567#匿名函数8 add = lambda a,b : a + b
9print add(2,3)
原文:http://www.cnblogs.com/pyramid1001/p/5844861.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!