Python入门笔记02,python函数暗中认可参数成效域

当def函数参数暗中认可值为目的时,比如列表[],字典{}

二、函数

python 在调用时总括暗许值

世家都晓得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]

[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))

太阳集团游戏官方网站 1

 

     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卡塔尔。

看看上述结果有哪些主张,为何吧???[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 的 69个 内建函数(Built-in Functions卡塔尔国:

D:Python27python.exe D:/untitled1/temp5.py
170580872
[1]
171586568
['a', 'b', 'c', 2]
170580872
[1, 3]
    Built-in Functions    
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()  
delattr() hash() memoryview() set()  

从出口中,能够看出,除了,第三个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 创立函数的格式如下:

 

 

小结:

太阳集团游戏官方网站 2

      
1.python概念def的时候,假若参数做为对象,那么,若无变动那几个指标的前提下,那么即便,数十次调用该函数也,不会创设新的靶子。

 

         
那么就能够冒出数十次调用函数,有望都进展了管理。

 

  2.要是,没有异样要求,函数参数,尽量不使用对象,如若风流浪漫有亟待,对象开展内部管理理。传私下认可值None

★ 重 点:

 

  ① def(即 define
,定义卡塔 尔(英语:State of Qatar)的意义是创设函数,也正是概念三个函数。

  ② 闭合括号后边的 冒号( 卡塔尔不可能缺少。

  ③ 函数「缩进」前面包车型地铁言语被称作
语句块(block卡塔尔,缩进是为着表明语句和逻辑的凭借关系,是 Python
最引人瞩目标特色之风流倜傥。(大部分言语会用大括号 { } 来注解那样附属关系卡塔 尔(英语:State of Qatar)

  ④ return 即再次回到结果。在 Python 中 return 是可选的,若无 return
即函数的重返值为 ‘None’。 

 

☆ 注意:

  ① def 和 return 是 关键字(keyword卡塔尔国,Python
就是靠识别那些特定的注重字来通晓顾客的意向,达成特别复杂的编程。

  ② 在 Python 中 return 是可选的(optional卡塔尔,那意味你在成立函数时不写 return 也足以高枕无忧地定义叁个函数并调用,只不过重临值 是 ‘None’ 罢了。

  ③ 大家把 使用函数 这种行为称作“调用”(call)。即 调用函数 。

 

太阳集团游戏官方网站 3

 

# 例子,温度的单位有 摄氏度 和 华氏度
,已知 摄氏度 与 华氏度 的转会公式为: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)」。

 

太阳集团游戏官方网站 4

 

# 例子,大家已知 梯形面积的计算公式为: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

 

☆ 注意:

    在 创立函数 时 设定的参数是「形参」,在 调用函数 时
填入的参数是「实参」,大家要搞精晓那五个概念。

 

– 默 认 参 数

 

    暗中认可参数 正是函数中某些有默许值的参数。调用函数时就是不予以填入参数,该函数如故能照常运作。

 

  参数的默许值能够被改动,即 暗中认可参数能够被再次赋值。

 

   
给八个参数设定默许值(创设暗中同意参数卡塔 尔(英语:State of Qatar)特别简单,我们只须求在概念参数的时候给参数赋值就可以。如下:

 

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!!!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注