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