初学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 ...
随机推荐
- Ruby中文乱码问题
中文乱码问题 解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*-(EMAC写法) 或者 #coding=utf-8 就行了. 源代码文件中,若包含中文编码,则需要注意两点: ...
- windows端口占用处理工具
一.描述 笔者在最近使用tomcat时,老是会遇到这种端口占用的问题,便写了这个小的exe,用于解决windows下的端口占用问题. 好吧,其实是我实在记不住CMD下的那几行命令.这玩意的实现比较简单 ...
- XCOM2中敌对生物设计分析(Aliens篇)
Aliens Aliens作为游戏设定中入侵的外星人,有各式外貌及奇特的战斗方式,掌握一些高能科技或利用精神力量进行攻击 Sectoid 使用灵能战斗的外星人,并无高级版本,初级便会使用精神控制,生命 ...
- js模版引擎开发实战以及对eval函数的改进
简介 前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用,同时也算是之前学习的知识的一种总结吧! 首先我们先了解一下模版引擎的工作原理吧! 1. 模版引擎其实就是将指定标签的内容根 ...
- StructureMap经典的IoC/DI容器
StructureMap是一款很老的IoC/DI容器,从2004年.NET 1.1支持至今. 一个使用例子 //创建业务接口 public interface IDispatchService { } ...
- linux开机启动smb服务
修改/etc/rc.local文件(增加红色部分) [root@localhost ~]# cat /etc/rc.local #!/bin/sh## This script will be exec ...
- ci框架中表前缀的处理
后面的写死,前面的无论如何改变都没事,会自动的替换,以后如果数据库的表前缀被修改了,只需要修改上面的配置项,下面的不变
- Idea调试显示切换数据源的设置
使用IDEA调试时,如果遇到相同方法会在编辑器上提示切换到哪个项目,因为手滑点了Disable,所以导致后来就不提示了,记录下设置方法.
- net::ERR_CONNCTION_ABORTED与http post request header is too large 错误
开始浏览器报(net::ERR_CONNCTION_ABORTED)然后就一直找这个错误是怎么引起的,找了一圈也没有找到答案. 后来看了一下后台发出后台错http post request heade ...
- 外部世界如何访问容器? - 每天5分钟玩转 Docker 容器技术(37)
上节我们学习了容器如何访问外部网络,今天讨论另一个方向:外部网络如何访问到容器? 答案是:端口映射. docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器.容器 ...