初学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(九)——函数的更多相关文章

  1. 初学 Python(十三)——匿名函数

    初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...

  2. 初学 Python(十二)——高阶函数

    初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...

  3. Python中函数、类、模块和包的调用

    初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...

  4. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  5. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  6. 初学python之感悟

    python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...

  7. 初学Python常见异常错误,总有一处你会遇到!

    初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了pytho ...

  8. 初学Python写二进制文件

    初学Python写二进制文件 把一个图片的16进制数据保存到一个txt文本,从这个txt文本读出并保存为二进制文件jpg图片文件.说明:图片读出的0xff粘贴ff到文本中,读出时是字符串的”ff”. ...

  9. 初学Python,需要装什么软件?

    学习Python需要安装什么软件呢?也许你是一位编程小白,还不知道如何如何安装Python软件和开发环境.那么今天我们就来学一下关于Python软件.开发环境的相关知识,希望对你有用. 学Python ...

随机推荐

  1. Facebook开源Zstandard新型压缩算法代替Zlib 简单使用

    简介 Zstandard(缩写为Zstd)是由Facebook的Yann Collet开发的一个无损数据压缩算法.Zstandard在设计上与DEFLATE(.zip.gzip)算法有着差不多的压缩比 ...

  2. Spring mvc 中使用 kaptcha 验证码

    生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目.使用Kaptcha 生成验证码十分简单并且参数可以进行自定义.只需添加jar包配置下就可 ...

  3. /dev/shm 与 tmpfs

    1./dev/shm 与 tmpfs /dev/shm/是linux下一个目录,/dev/shm目录不在磁盘上,而是在内存里, 类型为 tmpfs ,因此使用linux /dev/shm/ 的效率非常 ...

  4. [USACO07NOV]电话线Telephone Wire

    [USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec  内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...

  5. 关闭数据库下的所有连接操作 sql存储过程

    use master go )) as begin ),) declare @spid int set @sql='declare getspid cursor for select spid fro ...

  6. 数据库外连接及MySQL实现

    MySQL查询分为内连接查询和外连接查询,他们的区别在于:内连接查询的两个表示对等关系,根据条件进行匹配:外连接是以某一个表为主,两一个表根据条件进行关联.外连接分为左外连接.右外连接和全外连接.本文 ...

  7. 【Android Developers Training】 72. 缩放一个视图

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 原生js 实现 Ajax 跨浏览器使用

    js 实现 Ajax 跨浏览器使用 var CommonUtils = {}; (function(CommonUtils){ //---- Ajax module ---- CommonUtils. ...

  9. Spring中实现定时调度

    1,   内容简介 所谓的定时调度,是指在无人值守的时候系统可以在某一时刻执行某些特定的功能采用的一种机制,对于传统的开发而言,定时调度的操作分为两种形式: 定时触发:到某一时间点上执行某些处理操作: ...

  10. alibaba druid 在springboot start autoconfig 下的bug

    alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...