初学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 ...
随机推荐
- JavaScript面向对象之Windows对象
JavaScript之Window对象 首先我们先了解一个概念:事件. 事件,就是把一段代码设置好,满足条件时触发.或者说,事件是可以被 JavaScript 侦测到的行为. 网页中每个元素都可以触发 ...
- 主要排序算法的Java实现
最近温习算法,花点时间写了点代码验证下,在这里做个存档. package com.chrischeng.hacker; import java.util.*; /** * Created by Yex ...
- Oracle Job定时任务的使用详解
oracle中的job能为你做的就是在你规定的时间格式里执行存储过程,定时执行一个任务 .下面是一个小案例,定时每15分钟向一张表插入一条数据 一 1.创建一张测试表 -- Create table ...
- js模版引擎开发实战以及对eval函数的改进
简介 前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用,同时也算是之前学习的知识的一种总结吧! 首先我们先了解一下模版引擎的工作原理吧! 1. 模版引擎其实就是将指定标签的内容根 ...
- Java 基础 标识符的命名
java标识符的命名规则和规范 首先,标识符是在Java程序中能够自己进行命名的地方,例如:类名,方法名,接口名,变量名,常量名...等. 命名规则: 1.由26个英文字母的大小写,0-9的数字,_或 ...
- php追加数组
<?php //追加数组 array_merge_recursive()函数与array_merge()相同,可以将两个或多个数组合并在一起,形成一个联合的数组.两者之间的区别在于,当某个输入数 ...
- juggle添加c#版本
此前做过一个c++版的网络层dsl:http://www.cnblogs.com/qianqians/p/4255034.html 现在给这个dsl加入c#的支持,并且对代码的结构做了优化,将语法解析 ...
- 【Android Developers Training】 6. 配置Action Bar
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【PHP】制作日历
本期本博主将讲述两种利用PHP制作日历的方法,由于PHP日期函数的便捷性,使得我们制作日历这一过程变得相当简单 问题描述: 1.取到当前日期,并着色显示:2.根据当前日期,判断本月有多少天,一号是周几 ...
- date时间转换
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...