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

    科技2022-07-16  146

    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教程就到这了,欢迎继续收看!

    Processed: 0.008, SQL: 8