初学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. ASP.NET MVC + ECharts图表案例

    废话不多说直接讲讲今天要做的事. 利用微软爸爸的MVC框架结合百度的良心产品ECharts图表进行动态图表的生成,本文以柱状图为例. ECharts下载以及相关文档:http://echarts.ba ...

  2. cadence pcb 设计学习记录提纲

    Cadence软件是一款"一站式"的电气EDA软件系统.因能力所限,此处仅涉及使用cadence软件绘制PCB.日后随着对软件使用程度的加深,自己打算学习使用cadence软件的原 ...

  3. ecshop和jQuery冲突

    这个问题看ecshop的论坛里有很多帖子,解决方案就好几种,但是有几个标注完美解决方案的需要更改很多文件,对于我们这种初学者出现了问题的话是不知道怎么调试的. 找到一个很简单的解决方案,论坛里说只能解 ...

  4. Linux下Shadow socks的安装和配置

    实在受不了在Windows下编程,所以自己就安装了一个Ubutun,公司用的FQ软件shadowsocks在Windows上用起来很简单很爽,但是在Ubutun上的安装和配置就没那么简单了,写下这篇文 ...

  5. 高考志愿填报:java 软件 程序员 目前的就业现状

    大约在17年前,也就是2000年,学计算机专业的学生可以有大部分都进入本专业,并且就业非常容易.哪怕只会office套件,想找个工作也很简单.那时候学计算机就是最热门的行业. 那时候,搞Java的还是 ...

  6. tomcat运行war包报错,找不到context-root文件

    今天在部署项目的时候遇到了这个问题,查看Tomcat日志/logs/cataline.out这个文件. 里面有一句:can not open .....[context-root.xml], 进过很长 ...

  7. linux使用crontab实现PHP执行定时任务

    首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务. 所有用户定义的 crontab 都被保存在/var/spool/cron ...

  8. Swift区间运算符

    Swift 提供了两个方便表达一个区间的值的运算符. 闭区间运算符 闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间. ‌ 闭区间运算符在迭代一个区间的所有值时是非常有用的, ...

  9. golang中defer的使用规则

    转自个人博客chinazt.cc 在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用. ...

  10. win32SDK的hello,world程序(二)

    接上篇,原生的控件都不太好看,所以决定自己画一个,稍微处理下消息就能用了.不过,美化这东西是需要天赋的.即使技术再好,没有对UI布局调整和良好的审美能力,做出来的东西还是很挫. 主要把消息逻辑和画的过 ...