当def函数参数默许值为目的时,举例列表[],字典{}
二、函数
世家都明白python的默许值是在函数定义时总计出来的,
也正是说私下认可值只会精兵简政一遍, 之后函数调用时, 借使参数未有交给,
同叁个值会赋值给变量, 那会引致, 假诺我们想要二个list私下认可值,
新手常常那样写:
def foo(a=[]):
a.append(3)
print a
其实是八花九裂的,五回调用会那样的结果:
[3]
[3, 3]
实际应当这么写
金沙国际唯一官网网址 ,def baz(a=None):
a = a or []
a.append(3)
print a
五回调用输出以下结果:
[3]
[www.2979.com ,3]
这么好挫啊, 搞的即使有暗中认可值用法,可是我们却须要写的和js,lua同样,
大家无法像c++相似, 在函数运转时每回试行暗中同意值么.
用decorator能够一成不改变下
复制代码
import functools
import copy
def compute_default_value_for_each_call(func):
defaults = func.__defaults__
if not defaults:
return None
defaults = tuple(copy.copy(x) for x in defaults)
@functools.wraps(func)
def wrapper(*args, **kwargs):
if func.__defaults__ != defaults:
func.__defaults__ = tuple(copy.copy(y) for y in
defaults)
return func(*args, **kwargs)
return wrapper
@compute_default_value_for_each_call
def foo(b, a=[]):
if b:
a.append(3)
return a
import timeit
复制代码
这样四次调用foo(1), 结果为:
[3]
[3]
那些decorator有对未修正默许参数值做优化,
在大家不对暗中认可值改善的情事下(例如打字与印刷变量a的内容), 品质有十分的大晋级:
复制代码
@compute_default_value_for_each_call
def foo(b, a=[]):
if b:
a.append(3)
return a
def foo2(b, a=None):
a = a or []
if b:
a.append(3)
return a
import timeit
print timeit.timeit(‘foo(1)’, setup=’from __main__ import foo’)
print timeit.timeit(‘foo(0)’, setup=’from __main__ import foo’)
print timeit.timeit(‘foo2(1)’, setup=’from __main__ import foo2′)
print timeit.timeit(‘foo2(0)’, setup=’from __main__ import foo2′)
复制代码
推行结果(调用1000000次的总时间)
4.32704997063
0.630109071732
0.445858955383
0.26370882988
性情上还过得去….
在调用时总计暗中认可值
大家都知情python的暗中认可值是在函数定义时总计出来的,
也正是说暗中同意值只会总计三次, 之后函数调用时, 如若参数…
示范1:猜想一下,会输出什么???
2.1、重新认知函数
def ddd(a,b=[]):
b.append(a)
return b
print(ddd(1))
print(ddd(2,['a','b','c']))
print(ddd(3))
Python
中所谓的选用函数,正是把您要处理的目的放置一个名字背后的括号里。由此可见,函数便是这么使用的,往里面塞东西就能够收获管理结果。
[1]
[‘a’,’b’,’c’,’2′] [3] ?????你是不是以为是如此? 输出一下拜候
输出结果:
– Python 的 内建函数(Built-in Functions卡塔尔
D:Python27python.exe D:/untitled1/temp5.py
[1]
['a', 'b', 'c', 2]
[1, 3]
以 Python 3.60 版本为例,生机勃勃共存在 68 个这么的函数,它们被统称为
内建函数(Built-in Functions卡塔 尔(英语:State of Qatar)。
看看上述结果有哪些主张,为啥吧???[1,
3]而不是[3],那么改良一下代码,输出b变量的内部存储器地址看一下。作者想,能够找到本人要的答案
为此被称呼内建函数,实际不是因为还会有“外建函数”那些定义,“内建”的情趣是在
Python 3.60 版本安装到位后,你不要制培育能够直接采取这几个函数,即
表示那几个函数是“自带”的而已。
def ddd(a,b=[]):
b.append(a)
print(id(b)) #查看内存地址
return b
print(ddd(1))
print(ddd(2,['a','b','c']))
print(ddd(3))
输出结果:
Python 3.60 的 柒十二个 内建函数(Built-in Functions卡塔 尔(英语:State of Qatar):
D:Python27python.exe D:/untitled1/temp5.py
170580872
[1]
171586568
['a', 'b', 'c', 2]
170580872
[1, 3]
从出口中,能够见到,除了,第叁个print,此外多个内部存款和储蓄器是风度翩翩们的。那么考虑一下为什么第叁个为被改成。结果肯定,因为第叁个print改变了,b对象,重新创造了三个目的。
那么风流倜傥旦不想出现,每一趟调用,默许值对象不改变的主题材料,能够这么改一下:
2.2、创设函数
def ddd(a,b=None):
if type(b).__name__!='list':
b = []
b.append(a)
print(id(b)) #查看内存地址
return b
print(ddd(1))
print(ddd(2,['a','b','c']))
print(ddd(3))
起头值设置为None,通过品种剖断来,进行内部管理理
– Python 创造函数的格式如下:
小结:
1.python定义def的时候,假诺参数做为对象,那么,若无修改那么些目的的前提下,那么纵然,数十次调用该函数也,不会创设新的靶子。
那么就能够现出每每调用函数,有望都实行了拍卖。
2.万生机勃勃,未有新鲜必要,函数参数,尽量不行使对象,假若意气风发有亟待,对象开展内管理。传暗许值None
★ 重 点:
① def(即 define
,定义卡塔 尔(阿拉伯语:قطر的意义是创造函数,也等于概念多个函数。
② 闭合括号前边的 冒号( : 卡塔尔不可能贫乏。
③ 函数「缩进」前边的言语被称作
语句块(block卡塔 尔(英语:State of Qatar),缩进是为着标注语句和逻辑的附属关系,是 Python
最明确的特性之生龙活虎。(大部分语言会用大括号 { } 来注脚那样从属关系卡塔 尔(英语:State of Qatar)
④ return 即重临结果。在 Python 中 return 是可选的,若无 return
即函数的再次来到值为 ‘None’。
☆ 注意:
① def 和 return 是 关键字(keyword卡塔尔,Python
正是靠识别那几个特定的最首要字来理解客户的用意,达成更为复杂的编制程序。
② 在 Python 中 return 是可选的(optional卡塔尔,那意味你在创建函数时不写 return 也足以安枕无忧地定义贰个函数并调用,只可是重回值 是 ‘None’ 罢了。
③ 咱们把 使用函数 这种作为称为“调用”(call)。即 调用函数 。
# 例子,温度的单位有 摄氏度 和 华氏度
,已知 摄氏度 与 华氏度 的中间转播公式为:F = 9/5*C+32 。
# 现在我们创立三个能达成 摄氏度 转变为
华氏度 的函数,并调用该函数达成转变:
def temp_converter(c):
return str(9/5*c+32) + ‘?F’
c_in = input(‘请输入摄氏温度:’)
c_in = int(c_in)
f = temp_converter(c_in)
print(‘华氏温度为:’ + f)
2.3、传递参数与参数类型
– 地方参数 与 关键词参数
依照分裂传递参数的方法,能够分为:地点参数 (positional argument)
与 重大词参数 (keyword argument)。
在 调用函数 时,遵照 该函数被创立时
各参数所在的职位顺序,分别把参数的值按梯次填到对应之处,那样种传播参数的方法被称作「职位参数 (positional
argument)」。
在 调用函数
时,在种种参数名称后边授予二个大家想要传入的值。这种以名称作为生机勃勃豆蔻梢头对应的参数字传送入方式被称作「关键词参数 (keyword
argument)」。
# 例子,大家已知 梯形面积的总计公式为:S =
(a+b)*h/2
# 创设多个函数,总计梯形面积:
def tra_area(a,b,h):
return 1/2 * (a + b) * h
print(tra_area(h=3,b=2,a=1)) #
-成功,输出:4.5
print(tra_area(h=3,b=2,1)) #
-败北!原因:「地方参数」不可能在「关键词参数」之后现身!
print(tra_area(a=1,b=2,3)) #
-退步!原因:「地点参数」无法在「关键词参数」之后现身!
print(tra_area(1,2,h=3)) #
-成功,输出:4.5
print(tra_area(1,2,b=3)) #
-退步!原因:同三个参数无法被重复赋值!
☆ 注意:
①「关键词参数」能够不思量地点顺序。
②「地点参数」不能够在「关键词参数」之后现身!
③ 同多个参数不能够被重复赋值!
#
大家后天给生机勃勃组变量赋值,然后再调用函数,大家来看结果会有啥变化:
a = 1
b = 2
h = 3
print(tra_area(h,b,a)) # 输出:2.5
print(tra_area(h = h,b = b,a = a)) #
输出:4.5
☆ 注意:
在 创造函数 时 设定的参数是「形参」,在 调用函数 时
填入的参数是「实参」,大家要搞通晓那八个概念。
– 默 认 参 数
默许参数 正是函数中有些有默许值的参数。调用函数时便是不予以填入参数,该函数仍旧能照常运作。
参数的默许值能够被改成,即 私下认可参数能够被另行赋值。
给一个参数设定暗中认可值(创立默许参数卡塔尔特别轻便,大家只供给在概念参数的时候给参数赋值就可以。如下:
def tra_area(a,b,h=3):
return 1/2 * (a + b) * h
print(tra_area(1,2)) # 输出:4.5
print(tra_area(1,2,6)) # 给暗中同意参数重新赋值 6,输出:9.0
print(tra_area(1,2,h=6)) # 给默许参数重新赋值 6,输出:9.0
☆ print()函数的暗许参数
sep(用于设定七个打字与印刷结果里面包车型大巴相间符号卡塔尔国的私下认可值为‘
’空格,不过我们能够将其再度设定为‘/n’ 即 换行
。也正是说将每一个打字与印刷结果以换行符号举办划分。如下:
print(‘ *’,’ ***’,’*****’,’ |’,sep=’n’)
”””””””””””””””””’
上述代码输出:
*
***
*****
|
”””””””””””””””””’
2.4、设计自身的函数
* 若是您现在往何地去跟哪个人 函数 和 方法
到底是怎么着关联的话,为了顺遂地现在开展,作者得以告知你 方法 便是 函数
的风流倜傥种,只然而在不一样之处而已,使用原理和函数特别相同。
# 创建 file_create()
函数,功能:成立文件(尤其是.py文件卡塔尔国
# 该函数共有4个参数:
# namn -文件名
# content -文件内容
# extension -文件扩张名,即 后缀
# path -文件坐在的目录路线
def file_create(name,content,extension=’py’,path=’E:/PY_Test/New/’):
full_path = path + name + ‘.’ + extension
file = open(full_path,’w’)
file.write(content)
file.close()
print(‘文件 ‘ + name + ‘.’ + extension + ‘ 已被创制在 ‘ + path + ‘
中。’)
file_create(‘test’,’# hello world’) #
调用函数
# 创建 word_filter()
函数,效率:单词过滤器
# 该函数共有3个参数:
# content -内容
# target_word -要被过滤的单词
# new_word – 替换的单词
# 推行成功 再次来到被过滤后的内容(str类型卡塔尔。
def word_filter(content,target_word=’lame’,new_word=’Awesome’):
return content.replace(target_word,new_word)
new_content = word_filter(‘Python is lame! is very lame!! is very very
lame!!!’) # 调用函数
print(new_content)
# 输出:Python is Awesome中所谓的使用函数,其实应该这么写。! is very
Awesome!! is very very Awesome!!!