Python学习笔记——函数
Posted oliver.lee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记——函数相关的知识,希望对你有一定的参考价值。
一、什么是函数
函数是可被调用的,可重复使用的,用来实现单一,或相关功能的代码段。
函数的作用:
- 减少重复代码,提高应用的模块性
- 保持代码的一致性
- 增删改代码一次搞定,简单粗暴,更易扩展
一、创建函数
1、定义一个函数的规则
- 函数代码块以def关键字开头,后接函数标识符名称和()
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
- 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明
- 函数内容以冒号起始,并且缩进
- return[表达式]结束函数,选择性返回一个值给调用方。如果没有return,则相当于返回None
语法:
1 def 函数名 (参数列表) 2 函数体
2、形参和实参
形参:虚拟变量,在定义函数和函数体的时候使用形参。目的是在函数调用时接收实参,实参个数、类型要与形参一一对应。
实参:调用函数时传给函数的参数。可以是常量、变量、表达式、函数。
形参不占用内存空间,形参变量只有在被调用时才分配内存单元。
1 import time 2 def action1(n): 3 print(‘Start action 1.‘) 4 logger(n) 5 def action2(n): 6 print(‘Start action 2.‘) 7 logger(n) 8 def action3(n): 9 print(‘Start action 3.‘) 10 logger(n) 11 def 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‘): 2 3 print(‘Name:%s‘%name) 4 print(‘age:%s‘%age) 5 print(‘Sex:%s‘%sex) 6 return 7 8 print_info(‘alex‘,18) 9 print_info(‘铁锤‘,40,‘female‘)
不定长参数
例1:
1 def add(*args): 2 print(‘args:‘,args) 3 sum = 0 4 for i in args: 5 sum += i 6 return sum 7 print(‘sum:‘,add(1,2,3,4,5))
输出:
args: (1, 2, 3, 4, 5)
sum: 15
例2:
1 def print_info(**kwargs): 2 print(‘kwargs:‘,kwargs) 3 sum = 0 4 for i in kwargs: 5 print(‘%s:%s‘ % (i, kwargs[i])) 6 7 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 2 def outer(): 3 global count #打印前需先定义count的作用域 4 print(count) #local variable ‘count‘ referenced before assignment 5 count = 100 6 print(count) 7 outer()
nonlocal关键字:
例:(将local作用域中的变量声明为enclosing作用域)
1 def outer(): 2 count = 10 3 def inner(): 4 nonlocal count #先声明为enclosing作用域 5 count = 20 6 print(count) 7 inner() 8 print(count) 9 outer()
在局部作用域,不能修改全局作用域的变量。
在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的
6、高阶函数
将函数名作为实参传给另一个函数使用。
1 def f(n): 2 return n*n 3 def foo(a,b,func): 4 return func(a)+func(b) 5 print(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: 3 return n - 1 4 return fibo(n-1)+fibo(n-2) 5 6 print(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‘] 2 def fun1(s): 3 if s != ‘a‘: 4 return s 5 ret = filter(fun1, str) 6 print(list(ret)) # ret是一个迭代器对象
输出: [‘b‘, ‘c‘, ‘d‘]
map(function, sequence)
1 str = [‘hello‘, ‘a‘, ‘b‘] 2 def fun2(s): 3 return s + "alvin" 4 ret = map(fun2, str) 5 print(ret) # map object的迭代器 6 print(list(ret))
输出:
<map object at 0x7f382ca0aba8> [‘helloalvin‘, ‘aalvin‘, ‘balvin‘]
reduce(function, sequence, starting_value)
1 from functools import reduce 2 def add1(x, y): 3 return x + y 4 print(reduce(add1, range(1, 101))) ## 4950 (注:1+2+...+99) 5 6 print(reduce(add1, range(1, 101), 20)) ## 4970 (注:1+2+...+99+20)
输出:
5050 5070
lambda
1 def add(a,b): 2 return a + b 3 4 print add(2,3) 5 6 7 #匿名函数 8 add = lambda a,b : a + b 9 print add(2,3)
以上是关于Python学习笔记——函数的主要内容,如果未能解决你的问题,请参考以下文章