初学Python函数的笔记整理


Posted in Python onApril 07, 2015

 定义
返回单值

def my_abs(x):
  if x >= 0:
    return x
  else:
    return -x

返回多值

返回多值就是返回一个tuple

import math
 
def move(x, y, step, angle=0):
  nx = x + step * math.cos(angle)
  ny = y - step * math.sin(angle)
  return nx, ny

空函数
 

def nop():
  pass

指定默认参数

必选参数在前,默认参数在后。默认参数需指向不可变对象(默认参数值在函数定义时被计算)
 

def power(x, n=2):
  s = 1
  while n > 0:
    n = n - 1
    s = s * x
  return s

可变参数
 

def calc(*numbers):
  sum = 0
  for n in numbers:
    sum = sum + n * n
  return sum

调用可变参数的函数方法
 

>>> calc(1, 2)
5
>>> calc()
0
>>> nums = [1, 2, 3]
>>> calc(*nums)
14

关键字参数
 

def person(name, age, **kw):
  print 'name:', name, 'age:', age, 'other:', kw

调用关键字参数的方法
 

>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> kw = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **kw)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

注:

    参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
    对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

递归

如果一个函数在内部调用自身本身,这个函数就是递归函数。
尾递归

在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。
高阶函数

  •     变量可以指向函数(函数可以赋值给一个变量)
  •     函数名也是变量(函数名可以赋值其他值)
  •     函数可以做为函数的参数(高阶函数)

map(func, list)

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
 

>>> def f(x):
...   return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce(func_with_two_params, list)

reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
 

reduce(f, [x1, x2, x3, x4])
#相当于:
f(f(f(x1, x2), x3), x4)
 
>>> def add(x, y):
...   return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

filter(func_return_bool, list)

把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
 

def is_odd(n):
  return n % 2 == 1
 
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 结果: [1, 5, 9, 15]

sorted

对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,
 

>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]

高阶函数用法
 

def reversed_cmp(x, y):
  if x > y:
    return -1
  if x < y:
    return 1
  return 0
 
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

函数做为返回值
 

def lazy_sum(*args):
  def sum():
    ax = 0
    for n in args:
      ax = ax + n
    return ax
  return sum
 
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function sum at 0x10452f668>
>>> f()
25

注:每次调用lazy_sum()都会返回一个新的函数,即使传入相同的参数。
闭包
 

def count():
  fs = []
  for i in range(1, 4):
    def f():
       return i*i
    fs.append(f)
  return fs
 
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

原因是调用count的时候循环已经执行,但是f()还没有执行,直到调用其时才执行。所以返回函数不要引用任何循环变量,或者后续会发生变化的变量。
匿名函数(lambda表达式)
 

等价于:
 

def f(x):
  return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数做为返回值
 

def build(x, y):
  return lambda: x * x + y * y

装饰器(@func)

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),本质上,decorator就是一个返回函数的高阶函数。
 

def log(func):
  def wrapper(*args, **kw):
    print 'call %s():' % func.__name__
    return func(*args, **kw)
  return wrapper
 
@log
def now():
  print '2013-12-25'
 
>>> now()
call now():
2013-12-25
 
#相当于执行:
 
now = log(now)
回到顶部
带参数的装饰器
 
def log(text):
  def decorator(func):
    def wrapper(*args, **kw):
      print '%s %s():' % (text, func.__name__)
      return func(*args, **kw)
    return wrapper
  return decorator
 
@log('execute')
def now():
  print '2013-12-25'
 
#执行结果
>>> now()
execute now():
2013-12-25
 
#相当于执行:
 
>>> now = log('execute')(now)

剖析:首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

__name__
由于函数的__name__已经改变,依赖于此的代码就会出错。因此使用functools.wraps。
 
import functools
 
def log(func):
  @functools.wraps(func)
  def wrapper(*args, **kw):
    print 'call %s():' % func.__name__
    return func(*args, **kw)
  return wrapper
 
#对于带参函数
 
import functools
 
def log(text):
  def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
      print '%s %s():' % (text, func.__name__)
      return func(*args, **kw)
    return wrapper
  return decorator
偏函数(固定函数默认值)
 
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
 
#相当于:
 
def int2(x, base=2):
  return int(x, base)
 
max2 = functools.partial(max, 10)

相当于为max函数指定了第一个参数
 

max2(5, 6, 7)
 
#相当于:
 
max(10, 5, 6, 7)
Python 相关文章推荐
Python制作CSDN免积分下载器
Mar 10 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
Jan 08 Python
Python3.6简单反射操作示例
Jun 14 Python
python正则表达式之对号入座篇
Jul 24 Python
带你认识Django
Jan 15 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
Python使用永中文档转换服务
May 06 Python
利用Python绘制数据的瀑布图的教程
Apr 07 #Python
浅析Python中的多进程与多线程的使用
Apr 07 #Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 #Python
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 #Python
Python多线程编程(六):可重入锁RLock
Apr 05 #Python
Python多线程编程(五):死锁的形成
Apr 05 #Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 #Python
You might like
一个php作的文本留言本的例子(四)
2006/10/09 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
python先序遍历二叉树问题
2017/11/10 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python装饰器练习题及答案
2019/11/01 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
英国精品买手店:Browns Fashion
2016/09/29 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
文科教师毕业的自我评价
2014/01/16 职场文书
小学生获奖感言范文
2014/02/02 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
十八届三中全会感言
2014/03/10 职场文书
工业设计专业自荐书
2014/06/05 职场文书
会计学专业自荐信
2014/06/25 职场文书
2014年内勤工作总结
2014/11/24 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
一条 SQL 语句执行过程
2022/03/17 MySQL
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL
Python字符串格式化方式
2022/04/07 Python
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python