Python入门第13课——认识函数(只读课堂)

In [1]: #欢迎来到“只读课堂”!

   ...: #今天,我来讲一下比较“高级”的东西——函数。

   ...: #函数 - 抽象概念:

   ...: def get_keys(dict_varibal, value):

   ...: return[k for k, v in dict_varibal.items() if v == value]

   ...:

 

In [2]: get_keys(varibal, 200)

---------------------------------------------------------------------------

NameError Traceback (most recent call last)

<ipython-input-2-00aeb7bd039d> in <module>()

----> 1 get_keys(varibal, 200)

 

NameError: name 'varibal' is not defined

 

In [3]: #函数是组织好的,可重复使用的,能够完成特定功能的代码块,它是代码块的抽象。

 

In [4]: get_keys({'a':40}, 40)

Out[4]: ['a']

 

In [5]: #上面写好之后下面就可以直接引用。

 

In [6]: #———————————————————————————————————————————————————————————————————————

 

In [7]: def get_keys(dict_varibal, value):

   ...: return[k for k, v in dict_varibal.items() if v == value]

   ...:

 

In [8]: - get_keys 函数名

File "<ipython-input-8-8990094e194c>", line 1

- get_keys 函数名

^

SyntaxError: invalid syntax

 

 

In [9]: #get_keys 函数名

 

In [10]: #()中为参数

 

In [11]: #return是返回值

 

In [12]: #dict_varibal:形参,调用的时候传递的值才是实参。

 

In [13]: # 1.位置参数

    ...: # 2.关键字参数

    ...:

 

In [14]: #关键字参数:

 

In [15]: get_keys(dict_varibal={'a':40}, value=40)

Out[15]: ['a']

 

In [16]: #它跟上面是一样的,但是它可以不按照顺序去写:

 

In [17]: get_keys(value=40, dict_varibal={'a':40})

Out[17]: ['a']

 

In [18]: #两个参数调换位置都是可以的。

 

In [19]: get_keys(40, {'a':40})

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

<ipython-input-19-0b500268442c> in <module>()

----> 1 get_keys(40, {'a':40})

 

<ipython-input-7-f62f2c43da65> in get_keys(dict_varibal, value)

1 def get_keys(dict_varibal, value):

----> 2 return[k for k, v in dict_varibal.items() if v == value]

3

 

AttributeError: 'int' object has no attribute 'items'

 

In [20]: #因为在这行代码之前,并没有任何关键字,所以它会给我们报错。

 

In [21]: #位置参数是不可以交换位置的。

 

In [22]: #——————————————————————————————————————————————————————————————————————

 

In [23]: #Q:函数通过参数获取我们的值,函数中改变了参数的值,那么我们传递进去的值会改变吗?

 

In [24]: #这个问题留给大家后面去思考。

 

In [25]: #——————————————————————————————————————————————————————————————————————

 

In [26]: #装饰器

 

In [27]: a = 10

 

In [28]: b = [12,12]

 

In [29]: #我们可以管上面两行代码是int的变化。

 

In [30]: def test():

    ...: print('test')

    ...:

 

In [31]: c = test

 

In [32]: c.__name__

Out[32]: 'test'

 

In [33]: #它可以把函数赋值给一个变量。

 

In [34]: #我们可以在函数中用return返回一个值,但是,我们可不可以返回一个函数呢?是可以的。

 

In [35]: def test(func):

    ...: return func

    ...:

    ...: def func():

    ...: print('func run')

    ...:

    ...: test(func)

    ...:

Out[35]: <function __main__.func>

 

In [36]: #如果把它赋值给一个字母

 

In [37]: def test(func):

    ...: return func

    ...:

    ...: def func():

    ...: print('func run')

    ...:

    ...: f = test(func)

    ...: f.__name__

    ...:

Out[37]: 'func'

 

In [38]: f()

func run

 

In [39]: #函数可以当做函数的返回值进行返回。

 

In [40]: import random

 

In [41]: random.random()

Out[41]: 0.029448381122270884

 

In [42]: #它会生成一个随即类型的float数值。

 

In [43]: def test():

    ...: return random.random()

    ...:

 

In [44]: random.random()

Out[44]: 0.28808457985489067

 

In [45]: #它是随机的。

 

In [46]: #上面返回了一个从0到1的浮点值。

 

In [47]: #增加一个功能:

 

In [48]: #函数返回的浮点保留三个有效数字。

 

In [49]: def test():

    ...: return round(random.random(), 3)

    ...:

 

In [50]: test()

Out[50]: 0.82

In [51]: #如果我们有很多行代码,而都要保留3个有效数字,我们就要去大量的改代码。但是这样改是非常不友好的,那么,我们怎么做呢?

 

In [52]: #这里,就要提到函数的装饰器。

 

In [53]: #——————————————————————————————————————————————————————————————————————

 

In [54]: #Python中另一个语法糖,装饰器

 

In [55]: #返回一个从0到1的浮点值

 

In [56]: def test():

    ...: return random.random()

    ...:

 

In [57]: #如果不想改变函数本身的值:

 

In [58]: def decorator(func):

    ...: def wrapper(*args, **kwrgs):

    ...: return func()

    ...: renturn wrapper

File "<ipython-input-58-421758998585>", line 4

renturn wrapper

^

SyntaxError: invalid syntax

 

 

In [59]: def decorator(func):

    ...: def wrapper(*args, **kwrgs):

    ...: return func()

    ...: return wrapper

    ...:

 

In [60]: f = decorator(test)

 

In [61]: f()

Out[61]: 0.2097317770778121

 

In [62]: #它就调用了test

 

In [63]: # decorator 和 wrapper都是我们的,装饰器。

 

In [64]: f.__name__

Out[64]: 'wrapper'

 

In [65]: #wrapper执行的就是func

 

In [66]: def decorator(func):

    ...: def wrapper(*args, **kwargs):

    ...: return func(*args, **kwargs)

    ...: return wrapper

    ...:

 

In [67]: @decorator

    ...: def test():

    ...: return random.random()

    ...:

 

In [68]: test.__name__

Out[68]: 'wrapper'

 

In [69]: #@decorator就可以代替一些代码。

 

In [70]: def decorator(func):

    ...: def wrapper(*args, **kwargs):

    ...: # do something

    ...: return round(func(*args, **kwargs), 3)

    ...: return wrapper

    ...:

 

In [71]: test()

Out[71]: 0.04454240305722168

 

In [72]: @decorator

    ...: def test_two():

    ...: return random.random()*10

    ...:

 

In [73]: test_two()

Out[73]: 6.28

 

In [74]: #这样,我们就用装饰器修改了我们的代码,就不需要一一地修改所有值,这样给我们的编程提供了非常大的便利。

 

In [75]: print("\n本次“只读课堂”的python教程就到这了,欢迎继续收看!\n")

 

本次“只读课堂”的python教程就到这了,欢迎继续收看!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值