【python】函数
内置函数:
abs('A')
报错:TypeError: bad operand type for abs(): 'str'
传入的参数类型不对
自定义函数:
1 def my_abs(x):
2 if x >= 0:
3 return x
4 else:
5 return -x
6
7 my_abs('A')
报错:TypeError: unorderable types: str() >= int()
my_abs没有参数检查,会导致if语句出错,出错信息和abs不一样。所以,这个函数定义不够完善。
完善函数,对参数类型做检查:
def my_abs(x):
#数据类型检查可以用内置函数isinstance()实现
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
my_abs('A')
TypeError: bad operand type
变量可以指向函数
#函数名其实就是指向函数的变量
f=abs
print(f)
#结果:<built-in function abs> f=abs
print(f(-10))
#结果:10
高阶函数:一个函数接收另一个函数作为参数
def add(x,y,f):
return f(x)+f(y) def oo(x):
return x*x print(add(2,-3,oo))
13
map():
def f(x):
return x*x r=map(f,[1,2,3,4]) #结果r是一个Iterator,Iterator(迭代器?)是惰性序列 print(r)
print(list(r))
<map object at 0x00000000021C7EF0>
[1, 4, 9, 16]
reduce:
#reduce把结果继续和序列的下一个元素做累积计算 from functools import reduce
def add(x,y):
return x*x+y print(reduce(add,[1,2,3]))
12
filter()
#filter()接收一个函数和一个序列,把传入的函数依次作用于每个元素,然后根据返回值true or false决定保留还是舍弃该元素 #删掉偶数
def is_odd(n):
return n%2 == 1 print(list(filter(is_odd,[1,2,3,4,5])))
[1, 3, 5]
删除一个序列中的空字符串
def not_empty(s):
return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 结果: ['A', 'B', 'C']
sorted
print(sorted([3,6,-1,0,-7],key=abs))
[0, -1, 3, 6, -7]
返回函数:
def lazy_sum(*args):
def sum():
ax=0
for n in args:
ax=ax+n
return ax
return sum f=lazy_sum(1,2,3)
print(f)
print(f())
<function lazy_sum.<locals>.sum at 0x000000000270B9D8>
6
闭包:
返回的函数并没有立刻执行,而是直到调用了f()才执行
每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了
全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
def count():
fs=[]
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs f1,f2,f3=count()
f4=count()
print("f1:",f1,"f2:",f2,"f3:",f3)
print(f4) print(f1())
print(f2())
print(f3())
f1: <function count.<locals>.f at 0x000000000273C9D8> f2: <function count.<locals>.f at 0x000000000273CB70> f3: <function count.<locals>.f at 0x000000000273CBF8>
[<function count.<locals>.f at 0x000000000273CC80>, <function count.<locals>.f at 0x000000000273CD08>, <function count.<locals>.f at 0x000000000273CD90>]
9
9
9
匿名函数(不需要定义函数名的函数)
a=map(lambda x:x*x,[1,2,3,4,5,6])
print(list(a))
lambda等价于
def f(x):
return x*x
lambda是匿名函数,冒号前面的x是函数参数,x*x是表达式(匿名函数规定只能有一个表达式),不用写return,直接把表达式的运算结果返回
匿名函数也是对象,可以赋值给变量:
f=lambda x:x+x
print(f)
print(f(4))
<function <lambda> at 0x00000000020CCBF8>
8
匿名函数也可以作为函数返回值:
def build(x,y):
return lambda:x*x+y*y f=build(3,4)
print(f())
25
偏函数
import functools #int函数的可选参数base,把二进制转换为十进制
a=int('',base=2) #如果写函数的话
def int2(x,base=2):
return int(x,base)
print(int2('')) #使用偏函数
#把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单
int3=functools.partial(int,base=2)
print(int3(''))
【python】函数的更多相关文章
- python 函数之day3
一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- Python函数讲解
Python函数
- Python函数信息
Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...
- Python函数参数默认值的陷阱和原理深究"
本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- Python开发【第四章】:Python函数剖析
一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...
- Python函数解析
对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...
- Python入门笔记(18):Python函数(1):基础部分
一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...
- Python函数1
Python 函数命令的使用 想想我们之前数学中学到的函数,首先我们需要定义一个函数,例如f(x)=x, 当x输入任意数的时候,f(x)都能输出和x相等的数值. 那么在Python中是如何实现的呢? ...
- python函数传参是传值还是传引用?
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...
随机推荐
- LoadLibrary失败,GetLastError MOD_NOT_FOUND
即使传入的.dll文件存在,也可能返回这个错误.因为加载的DLL库可能以来其他库,尤其是编译器的dll. 以腾讯的debug版libtim.dll为例:如果没有msvcr100d.dll和msvcp1 ...
- shiro重新赋值权限
/** * 重新赋值权限(在比如:给一个角色临时添加一个权限,需要调用此方法刷新权限,否则还是没有刚赋值的权限) * @param myRealm 自定义的realm * @param usernam ...
- SSIS excel2003文件导入列名显示为F1,F2 - FN
问题现象: 数据源2003版本的EXCEL文件,第一列是空白,数据是从第二列开始的.所以SSIS中用EXCEL数据源倒入这个EXCEL时,所有的列显示不出来,显示的是F1,F2 - FN. 解决方法 ...
- unity-点乘和叉乘的应用
http://blog.csdn.net/oskytonight/article/details/38900087 点乘:两个向量点乘得到一个标量 ,数值等于两个向量长度相乘后再乘以二者夹角的余弦值 ...
- 【adb】adb基本命令总结
adb常用基本命令如下: adb devices 列出你的devices aapt dump badging <file_path.apk> 查看包名 adb ...
- MAC OSX环境下cordova+Ionic的安装配置
一.简介 1.Ionic是什么 IONIC 是目前最有潜力的一款 HTML5 手机应用开发框架.通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用. 它使用 JavaSc ...
- 简述linux的发行版,并描述不同发行版之间的联系与区别
bash命令行返回值和展开 标签(空格分隔): bash,命令,状态,展开 1.命令状态结果和执行结果 (1)命令执行的状态返回值,命令执行完成之后,其执行状态结果值保存于bash的特殊状态变量$?中 ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- python类中super()和__init__()的区别
class Base(object): def __init__(self): print 'Base create' class childB(Base): def __init__(sel ...
- 生产排产表DL-ZPPR002
*&---------------------------------------------------------------------* *& Report ZPPR002 * ...