函数是什么

函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的。程序里函数的定义是:

定义:将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

实例1

  1. def calcu(x,y):
  2. res = x**y
  3. return res #返回执行结果
  4.  
  5. result = calc(2,2)
  6. print(result )

实例2

  1. def student_fun(name,age,post):
  2. print("----学生信息------")
  3. print("姓名:",name)
  4. print("年龄:",age)
  5. print("职业:",post)
  6. print('')
  7.  
  8. student_fun('邹俊安',17,'学生')
  9. student_fun(age=17,name='文艺',post='学生')
  10. student_fun('王秋杰',45,'老师')

函数的参数

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

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

  1. name = "邹俊安"
  2.  
  3. def change_name(name):
  4. print("修改前:", name)
  5. name = "罗奥"
  6. print("修改后", name)
  7.  
  8. change_name(name)
  9.  
  10. print("name是什么?", name) #输出的name还是邹俊安

函数的作用域

函数内一般情况无法修改函数外变量

  1. name = "邹君安"
  2.  
  3. def change_name():
  4. name = "罗奥"
  5.  
  6. change_name(name)
  7.  
  8. print("name是什么?", name) #name还是邹俊安

可以通过global关键字来访问外部变量

  1. name = "邹君安"
  2.  
  3. def change_name():
  4. global name
  5. name = "罗奥"
  6.  
  7. change_name(name)
  8.  
  9. print("name是什么?", name) #name还是邹俊安

函数递归

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

注意:

1. 必须有一个明确的结束条件。

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少。

3. 递归效率不高,递归层次过多会导致栈溢出。(经过测试python3.6的最大的递归此时为978次)

  1. def calc(n):
  2. print(n)
  3. if int(n/2) ==0:
  4. return n
  5. return calc(int(n/2))
  6.  
  7. calc(10)
  8.  
  9. """
  10. 输出:
  11. 10
  12. 5
  13. 2
  14. 1
  15. """

匿名函数

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

因为非匿名函数在定义时,就已经创建函数对象和作用域对象;所以,即使未调用,也占用内存空间;

匿名函数,仅在调用时,才临时创建函数对象和作用域链对象;调用完,立即释放,所以匿名函数比非匿名函数更节省内存空间

  1. def calc1(n):
  2. return n ** 2
  3.  
  4. calc2 = lambda n: n ** 2
  5.  
  6. #结果相同
  7. print(calc1(10))
  8. print(calc2(10))

高阶函数

一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

  1. def f(n):
  2. return n*2
  3.  
  4. def add(a,b,f):
  5. return f(a) + f(b)
  6.  
  7. result = add(1,2,f)
  8. print(result) #结果:6

装饰器

  1. 需要知识
    1.函数即变量
    2.高阶函数
    a.把函数名当实参传给另外一个函数
    b.返回值包含函数名
    3.嵌套函数
    高阶函数+嵌套函数=》装饰器
  2.  
  3. *装饰器*
    定义:本质是函数,(装饰其他函数)就是为其他函数添加功能
    原则:a.不能修改被装饰的函数源代码
    b.不能修改被装饰的函数调用方式
  4.  
  5. 模型:
  1. def 函数名1(装饰器参数):
  2. def 函数名2(被装饰函数名):
  3. def 函数名3(被装饰函数的参数)
  4. 。。使用装饰器参数。。
  5. 返回值 = 被装饰函数使用(传递被装饰函数的参数)
  6. 。。balabala。。
  7. return 返回值
  8. return 函数名3
  9. return 函数名2
  10.  
  11. @函数名1(装饰器参数)
  12. def 装饰函数(参数):
  13. 。。balabala。。

现在你新入职了一家公司,工作是维护更新本公司网站,公司网站有3个入口: index、manage、topic,现在公司要求要在manage和topic入口需要登陆验证,函数代码极其复杂,而且很多地方都有调用,这时装饰器就派上了用处。

实例:

  1. username,password = '09w09',''
  2.  
  3. def check_user(check_type):
  4. def decorator(func):
  5. def func_num(*arg1,**arg2):
  6. if check_type == True:
  7. usernm = input("Please input username:")
  8. passwd = input("Please input username:")
  9. if usernm == username and passwd == password:
  10. res = func(*arg1,**arg2)
  11. print('执行函数后继续执行'.center(50,'-'))
  12. return res
  13. else:
  14. exit(0)
  15. else:
  16. passwd = input("09w09 please input password:")
  17. if passwd == password:
  18. res = func(*arg1, **arg2)
  19. print('执行函数后继续执行'.center(50, '-'))
  20. return res
  21. else:
  22. exit(0)
  23. return func_num
  24. return decorator
  25.  
  26. def index():
  27. print('Welcome to 09w09\'s index'.ljust(50,'*'))
  28.  
  29. @check_user(True)
  30. def manage(x):
  31. print('this is manage page!'.ljust(50,'*'),x)
  32.  
  33. @check_user(False)
  34. def topic():
  35. print('this is topic page'.ljust(50,'*'))
  36. return '\nok!\n'
  37.  
  38. index()
  39. manage('09w09')
  40. print(topic())

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

实例:

  1. >>> a = iter([1,2,3,4,5])
  2. >>> a
  3. <list_iterator object at 0x00000238F2D6DE48>
  4. >>> a.__next__()
  5. 1
  6. >>> a.__next__()
  7. 2
  8. >>> next(a)
  9. 3
  10. >>> next(a)
  11. 4
  12. >>> next(a)
  13. 5
  14. >>> next(a)
  15. Traceback (most recent call last):
  16. File "<pyshell#7>", line 1, in <module>
  17. next(a)
  18. StopIteration

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行

实例1:

  1. #生成器变成list
  2. print([i*2 for i in range(10)])
  3.  
  4. #list变成生成器
  5. print(iter([1,2,3,4,10,6,7,8]))

实例2:

  1. def produce(x):
  2. str = '*'
  3. for i in range(x):
  4. yield str
  5. str+='*'
  6.  
  7. def print_(p):
  8. while True:
  9. try:
  10. print(next(p))
  11. except StopIteration :
  12. print('ok:')
  13. break
  14.  
  15. print_(produce(10))
  16.  
  17. """
  18. 输出结果:
  19.  
  20. *
  21. **
  22. ***
  23. ****
  24. *****
  25. ******
  26. *******
  27. ********
  28. *********
  29. **********
  30. ok!
  31. """

yield实现在单线程的情况下实现并发运算的效果

  1. import time
  2.  
  3. def consumer(name):
  4. print('%s同学准备吃包子了' % name)
  5. while True:
  6. baozi = yield #每次执行都会停留在这里,
  7. print("%s同学吃了%s馅包子" % (name,baozi))
  8.  
  9. def producer(filling):
  10. c1 = consumer('陈敏')
  11. c2 = consumer('马国正')
  12. c1.__next__()
  13. c2.__next__()
  14. print('王嘉宁开始做包子了!')
  15. for i in range(10):
  16. time.sleep(1)
  17. print('陈敏做了2个%s馅包子' % filling)
  18. c1.send(filling)
  19. c2.send(filling)
  20.  
  21. producer('韭菜')
  1.  

4 - 函数&装饰器 and 迭代器&生成器的更多相关文章

  1. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  2. Python高手之路【四】python函数装饰器,迭代器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  3. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  4. python 函数之装饰器,迭代器,生成器

    装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...

  5. Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)

    Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数

  6. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  7. Python之路第四天,基础(4)-装饰器,迭代器,生成器

    装饰器 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象 ...

  8. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  9. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

随机推荐

  1. C#空接合操作符——??

    操作符: ?? 用法:C = A ?? B; 解释:if(A != null){ C=A;} else{C=B}     类似三元运算符 :? 例子: Int32? num1=null; Int32? ...

  2. PyCharm出现module 'matplotlib' has no attribute 'verbose'解决方案

    其实不是你安装错了,也不是你代码问题,这就是PyCharm的锅! 虽然有三种解法办法,我觉得还是改IDE配置是最佳方法 把这个钩去掉就行了...... # -*- coding: utf-8 -*- ...

  3. Android_靠谱的监听软键盘状态的方法

    public class MyActivity extends AppCompatActivity { /** * 当前界面中的软件盘的状态 */private boolean isKeyBoardO ...

  4. APP微信支付实现

    参考官方文档 设计到的API: 统一下单API.支付结果通知API和查询订单API 下面代码是请求预支付ID // 构建下单bean final WxPayUnifiedOrderBean unifi ...

  5. python 格式化时间含中文报错: 'locale' codec can't encode character '\u5e74'

    执行下面代码报错: UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: Illegal ...

  6. 用vector实现二维向量

    如果一个向量的每一个元素是一个向量,则称为二维向量,例如 vector<vector<int> >vv(3, vector<int>(4));//这里,两个“> ...

  7. 创建有关hbase数据库的项目时所遇到的问题

    1.在以前使用其他数据库时,经常会使用id自增来做主键,但是hbase数据库中不知道怎么来设置自增主键,所以我打算不要id自增主键.然后删除原来的表,重新创建表. 删除表语句: 用drop命令可以删除 ...

  8. java——简易版build模式

    参考教程:https://blog.csdn.net/fanxudonggreat/article/details/78927773 public class Computer { private S ...

  9. vue首次赋值不触发watch(deep immediate handler)

    deep:默认值是 false,代表是否深度监听.immediate:true代表如果在 wacth 里声明了之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样, ...

  10. springMVC初探视图解析器——InternalResourceViewResolver

    springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...