码迷,mamicode.com
首页 > 其他好文 > 详细

模块2-1 函数基础

时间:2020-02-03 10:10:34      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:斐波那契数   span   元组   文件   停止   bin   输入   ima   http   

函数的定义、参数、返回值和作用域

?

?

形参:

只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

?

实参:

可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先给实参赋值

技术图片

?

技术图片

关键参数:

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可(指定了参数名的参数就叫关键参数),但记住一个要求就是,关键参数必须放在位置参数(以位置顺序确定对应关系的参数)之后

?

位置参数:

给函数传参数要按顺序传入的参数就是位置参数

?

?

?

?

?

嵌套函数和匿名函数和高阶函数

?

就是写在函数里面的函数

每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。

技术图片

?

?

?

匿名函数就是不需要显式的指定函数名

#这段代码 def calc(x,y): return x**y print(calc(2,5)) #换成匿名函数 calc = lambda x,y:x**y print(calc(2,5))

?

?

?

只需满足以下任意一个条件,即是高阶函数

接受一个或多个函数作为输入

return 返回另外一个函数

实例:

技术图片

?

?

递归函数

?

在函数内部,可以调用其他函数。如果一个函数在内部调用自已本身,这个函数就叫做递归函数。

应用举例:用递归实现2分查找的算法,以从列表 a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] 查找指定的值。

a = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69, 107] def binary_search(start,end,n,d_list): mid = int((end+start)/2) print("当前中间位置:%s;数字是%s"%(mid,d_list[mid])) if start < end: if d_list[mid] < n: print("往右边找") binary_search(mid+1,end,n,d_list) elif d_list[mid] > n: print("往左边找") binary_search(start,mid,n,d_list) else: print("找到了,数字%s的位置是%s"%(n,mid)) else: print("没有找到指定的数 %s"%(n)) binary_search(0,len(a),22,a)

?

内置方法

?

?

名称空间 namespace

名称空间就是存放名字的地方。举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方

?

python中有四种名称空间:LEGB

查找的顺序是:

locals -> enclosing function -> globals ->builtins。

?

?

闭包

?

装饰器

?

在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能

1.不修改源代码

2.不修改调用方法

目标:添加新功能

?

# -*- encoding:utf-8 -*- import time def timer(func): def wrapper(*args,**kwargs): start_time = time.time() print("start_time:",start_time) res = func(*args,**kwargs) end_time = time.time() print("end_time:",end_time) print("run time is %s"%(end_time-start_time)) return res return wrapper @timer # 相当于执行了foo=timer(foo) def foo(a): time.sleep(3) print(a) print("from foo") foo("a-a")

?

import time def timer2(b): def timer(func): def wrapper(*args,**kwargs): start_time = time.time() print("start_time:",start_time) print(b) res = func(*args,**kwargs) end_time = time.time() print("end_time:",end_time) print("run time is %s"%(end_time-start_time)) return res return wrapper return timer @timer2("b-b") # 相当于执行了foo=timer(foo);和上面的例子相比,这边多了参数 def foo(a): time.sleep(3) print(a) print("from foo") foo("a-a")

?

?

列表生成式

?

a = [i+1 for i in range(10)]

?

?

生成器

?

一边循环一边计算后面元素的机制,称为生成器:generator。

举例:

技术图片

?

函数生成器

?

函数生成器实现斐波那契数列

def fib(n): a = 0 b = 1 i = 0 while i < n: yield b # 暂停,return tmp = a a = b b = tmp + b i += 1 f = fib(10) print(type(f)) print(f.__next__()) for i in f: print("i--",i)

?

函数生成器接受外部参数;利用生成器实现单线程多并发的例子,包子的故事

def consumer(name): print("消费者%s准备吃包子"%name) while True: baozi = yield #接受外部的参数 print("消费者%s收到包子编号:%s"%(name,baozi)) c1 = consumer("c1") c2 = consumer("c2") c3 = consumer("c3") c1.__next__() c2.__next__() c3.__next__() for i in range(10): print("----生成第%s批包子----"%i) c1.send(i) c2.send(i) c3.send(i)

?

?

迭代器

?

python为了提供一种不依赖于索引的迭代方式,

python会为一些对象内置__iter__方法

obj.__iter__称为可迭代的对象

?

  1. 一类是集合数据类型,如list、tuple、dict、set、str等;
  2. 一类是generator,包括生成器和带yield的generator function。

?

?

?

?

?

模块2-1 函数基础

标签:斐波那契数   span   元组   文件   停止   bin   输入   ima   http   

原文地址:https://www.cnblogs.com/wiaowupy/p/12254460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!