初学Python(九)——函数
初学Python(九)——函数
初学Python,主要整理一些学习到的知识点,这次是函数。
函数定义:
# -*- coding:utf-8 -*- #函数的定义
def my_function(x):
if x>0:
return x
elif x<0:
return -x
else:
pass
#函数的调用
a = my_function(-1)
b = my_function(2)
c = my_function(0)
print a,b,c #空函数,pass为占位符
def empty_function(x):
pass print empty_function(-1) #参数检查,给my_function函数加上参数检查
def my_function(x):
if not isinstance(x,(int,float)):
#raise相当于java中的throw,抛出异常
raise TypeError('UnExpectedType')
elif x>=0:
return x
else:
return -x print my_function(1)
print my_function(-1)
#print my_function('a')
#返回多个值,牛er逼
def multi_function(x):
x0 = x+1
x1 = x-1
#返回的其实就是一个tuple
return x0,x1 print multi_function(2)
参数:
#-*- coding:utf-8 -*- '''''
默认参数:
就是你不指定该参数的值时,
该参数有一个默认值
'''
def default_para(x,n=2,s=3):
return x*n*s
print default_para(2)
print default_para(2,3)
print default_para(2,n=5)
print default_para(2,s=3)
print default_para(2,n=2,s=4) #天坑
def default_para_hole(L=[]):
L.append('ITFOOTBALLCLUB')
return L
print default_para_hole()
print default_para_hole()
'''''
第一遍为['ITFOOTBALLCLUB']
第二遍为['ITFOOTBALLCLUB', 'ITFOOTBALLCLUB']
问题在于L的值在定义函数时就已经指明了对象,
如果你不指定参数,他默认只指向该对象,
如果该对象变了,那么默认参数的值也会变
所以要尽量使用不可变对象[]改为None
''' #去天坑版,None为不可变对象
def default_para_no_hole(L=None):
if L is None:
L = []
L.append('ITFOOTBALLCLUB')
return L print default_para_no_hole()
print default_para_no_hole() '''''
可变参数:
意思就是参数的个数是0..n个的
'''
#不用可变参数也能传入多个参数,使用list和tuple
def changeable_para(multi):
sum = 0
for n in multi:
sum+=n return sum
#0
print changeable_para([])
#list
print changeable_para([1,2,3,4,5])
#tuple
print changeable_para((1,2,3,4)) '''''
上面的方式也能实现传入0..n个参数的传递,
但是需要实现组装为list或tuple
如果你本来就有一个list或tuple,这么用
无可厚非
如果你不想每次都组装,你就可以使用可变参数
''' #改装版,可变参数就是在参数前加上一个星号(*),so easy
def changeable_para_update(*multi):
sum = 0
for n in multi:
sum+=n
return sum print changeable_para_update(1,2,3) #如果你本来就有list,可变参数也能融合
name = [1,3,4,7,9]
print changeable_para_update(*name) #这样是不是犀利多了 '''''
关键字参数:
传递0...n个带参数名的参数
参数名前加2个星号
''' def key_para(x,y,n=2,*numbers,**kp):
print x,y,n,numbers,kp
#只有必选参数
key_para(1,2)
#必选,默认
key_para(1,2,3)
#必选,默认,关键字
key_para(1,2,3,kw=99)
#必选,默认,可变(数组)
key_para(1,2,3,*[1,2])
#必选,默认,可变(数组)
key_para(1,2,3,*(1,2))
#必选,默认,可变
key_para(1,2,3,1,2)
#必选,默认,关键字(字典)
key_para(1,2,3,**{'test':'af','pld':'afe'})
#必选,默认,可变,关键字
key_para(1,2,3,*(1,2),kw=99) #所有的函数参数都可以用func(*args,**kw)来调用
递归函数:
# -*- coding:utf-8 -*- '''''
递归函数
''' def fact(n):
if n==1:
return 1
return fact(n-1)*n print fact(10) print fact(100) #尾递归解决栈溢出
#栈溢出
#print fact(1000)
#尾递归
def fact(n):
return fact_iter(1,1,n)
def fact_iter(n,count,max):
if count > max:
return n
return fact_iter(n*count,count+1,max)
'''''
但是python没有对尾递归做优化,
所以上面的尾递归依然会栈溢出,
(那还说个毛啊),不过国外有
人写了个装饰器,可以解决这个问题
有时间研究一下
'''
防止溢出:
#!/usr/bin/env python2.4
# This program shows off a python decorator(
# which implements tail call optimization. It
# does this by throwing an exception if it is
# it's own grandparent, and catching such
# exceptions to recall the stack. import sys class TailRecurseException:
def __init__(self, args, kwargs):
self.args = args
self.kwargs = kwargs def tail_call_optimized(g):
"""
This function decorates a function with tail call
optimization. It does this by throwing an exception
if it is it's own grandparent, and catching such
exceptions to fake the tail call optimization. This function fails if the decorated
function recurses in a non-tail context.
"""
def func(*args, **kwargs):
f = sys._getframe()
if f.f_back and f.f_back.f_back \
and f.f_back.f_back.f_code == f.f_code:
raise TailRecurseException(args, kwargs)
else:
while 1:
try:
return g(*args, **kwargs)
except TailRecurseException, e:
args = e.args
kwargs = e.kwargs
func.__doc__ = g.__doc__
return func @tail_call_optimized
def factorial(n, acc=1):
"calculate a factorial"
if n == 0:
return acc
return factorial(n-1, n*acc) print factorial(10000)
# prints a big, big number,
# but doesn't hit the recursion limit. @tail_call_optimized
def fib(i, current = 0, next = 1):
if i == 0:
return current
else:
return fib(i - 1, next, current + next) print fib(10000)
# also prints a big number,
# but doesn't hit the recursion limit.
初学Python(九)——函数的更多相关文章
- 初学 Python(十三)——匿名函数
初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...
- 初学 Python(十二)——高阶函数
初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...
- Python中函数、类、模块和包的调用
初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- 初学 Python(十四)——生成器
初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...
- 初学python之感悟
python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...
- 初学Python常见异常错误,总有一处你会遇到!
初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了pytho ...
- 初学Python写二进制文件
初学Python写二进制文件 把一个图片的16进制数据保存到一个txt文本,从这个txt文本读出并保存为二进制文件jpg图片文件.说明:图片读出的0xff粘贴ff到文本中,读出时是字符串的”ff”. ...
- 初学Python,需要装什么软件?
学习Python需要安装什么软件呢?也许你是一位编程小白,还不知道如何如何安装Python软件和开发环境.那么今天我们就来学一下关于Python软件.开发环境的相关知识,希望对你有用. 学Python ...
随机推荐
- 通过LOGBACK实现每个类、包或自定义级别
项实现LOGBACK对每个包或者类或者通过自定义级别的方式实现自定义输出的日志进入制定的文件.查阅了很多资料,都没有找到行之有效的解决方案,直到看到了这篇文章http://www.360doc.com ...
- android studio IDE 下,设置ACTIVITY全屏
因为ANDROID STUDIO的JAVA类是继承AppCompatActivity的 ,所以常规的全屏设置并不管用.如果要设置全屏,请参照如下代码/ 1/首先,打开AndroidManifest.x ...
- 摘抄自知乎的redis相关
1.知乎日报的基础数据和统计信息是用 Redis 存储的,这使得请求的平均响应时间能在 10ms 以下.其他数据仍然需要存放在另外的地方,其实完全用 Redis 也是可行的,主要的考量是内存占用.就使 ...
- Google云平台技术架构
Google Cloud 设计原理: 1.分布式文件系统: Google Distributed File System(GSF) 为了满足Google迅速增长的数据处理需求,我们设计并实现了G ...
- Akka(8): 分布式运算:Remoting-远程查找式
Akka是一种消息驱动运算模式,它实现跨JVM程序运算的方式是通过能跨JVM的消息系统来调动分布在不同JVM上ActorSystem中的Actor进行运算,前题是Akka的地址系统可以支持跨JVM定位 ...
- ubuntu忽然不能登录,输入密码正确一直返回登录界面
问题描述 由于配置eclipse命令启动,我修改了 /etc/environment 文件的内容,用命令 shutdown -r -now 重启后,输入密码正确一直返回登录界面. 查了下网上资料:系统 ...
- oracle备份、还原
----第一步:设置空表导出 ----由于Oracle 11G在用EXPORT导出时,空表不能导出.解决方法如下:(11G中有个新特性,当表无数据时,不分配segment,以节省空间) select ...
- 摘记:LoadRunner
infrastructure 基础结构 Load Testing:性能测试 predicts system behavior and performance exercises your entire ...
- CoolBlog开发笔记第4课:数据库模型设计
教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 1.3 CoolBlog开发笔记第3课:创建Django应用 前言 我新书<Py ...
- JavaScript深入浅出补充——(二)语句和严格模式,对象
三.语句和严格模式 JavaScript程序由语句组成,语句遵守语法规则. 例如:if语句,while语句,with语句等等-- block块语句 常用于组合0~多个语句,块语句用{}定义 直接以花括 ...