# coding = utf-8'''
函数声明:
def name([arg,... arg = value,... *arg, **kwarg]):suite1. 当编译器遇到 def,会生成创建函数对象指令。也就是说 def 是执⾏行指令,⽽不仅仅是个语法关键字。可以在任何地⽅方动态创建函数对象。
2. 可以使用默认参数、可变参数和关键字参数arg = value 是默认参数*args是可变参数,args接收的是一个tuple;**kwargs是关键字参数,kwargs接收的是一个dict。lambda函数
不同于⽤用 def 定义复杂函数,lambda 只能是有返回值的简单的表达式。使⽤用赋值语句会引发语法 错误,可以考虑⽤用函数代替。
''''''
*****************************************************
1. 函数创建函数是第一类对象,可作为其他函数的实参或返回值。函数总是有返回值。就算没有 return,默认也会返回 None。
*****************************************************
'''
def test1(name):'''>>> test1('a').__name__ # 查看函数返回函数的名字'a'>>> test1('b').__name__ # 查看函数返回函数的名字'b'>>> test1('a')()        # 调用函数返回的函数call function a>>> print(test1('c'))   # 调用函数,返回2个值:整型和字符串(0, 'test')'''if name == "a":def a():print('call function a')return aelif name == "b":def b(): passreturn belse:return 0, 'test''''
*************************************************************
2. 参数2.1 函数的传参方式灵活多变,可按位置顺序传参,也可不关⼼顺序⽤命名实参。
*************************************************************
'''
def test21(a, b):'''>>> test21(1,2)      # 位置参数1 2>>> test21(b=3,a=4)  # 命名参数4 3'''print(a, b)'''
*************************************************************2.2 ⽀持参数默认值。不过要⼩⼼,默认值对象在创建函数时生成,所有调用都使⽤同⼀对象。如果该默认值是可变类型,那么就如同 C 静态局部变量。
*************************************************************
'''
def test22(x, lst=[]):'''>>> test22(1)[1]>>> test22(2)   # 保持了上次调⽤用状态。[1, 2]>>> test22(3, [])   # 显式提供实参,不使⽤用默认值。[3]>>> test22(3)   # 再次使⽤用默认值,会继续使用默认的列表对象[1, 2, 3]'''lst.append(x)return lst'''
*************************************************************2.3 默认参数后⾯不能有其他位置参数,除非是变参。SyntaxError: def test23(a, b=1, c): pass2.4 用 *args 收集 "多余" 的位置参数,**kwargs 收集 "额外" 的命名参数。这两个名字只是惯例,可 ⾃自由命名。*args是可变参数,args接收的是一个tuple;**kwargs是关键字参数,kwargs接收的是一个dict。
*************************************************************
'''
def test24(a, b=1, *args, **kwargs):'''>>> test24(0)01(){}>>> test24(0,2,3,4)02(3, 4){}>>> test24(0,2,3,4,x=5)02(3, 4){'x': 5}# 可 "展开" 序列类型和字典,将全部元素当做多个实参使⽤用。如不展开的话,那仅是单个实参对象。>>> test24(*range(5), **{'x': 10, 'y': 11})01(2, 3, 4){'x': 10, 'y': 11}>>> test24(range(5))range(0, 5)1(){}# 单个 "*" 展开序列类型,或者仅是字典的主键列表。# "**" 展开字典键值对。但如果没有变参收集, 展开后多余的参数将引发异常。>>> p = dict(a=20,b=21)>>> test24(p){'a': 20, 'b': 21}1(){}>>> test24(*p)  # 仅展开 keys(),test("a"、"b")ab(){}>>> test24(**p)  # 展开 items(),test(a = 1, b = 2)。2021(){}'''print(a)print(b)print(args)print(kwargs)'''
*************************************************************
3. 作用域3.1 函数形参和内部变量都存储在 locals 名字空间中。
*************************************************************
'''
def test31(a, b=1):'''>>> test31(100){'s': 'Hello Python', 'b': 1, 'a': 100}'''s = 'Hello Python'print(locals())'''
*************************************************************3.2 除⾮使用 global、nonlocal 特别声明,否则,在函数内部使用赋值语句,总是在 locals 名字空间中 新建一个对象关联。注意:"赋值" 是指名字指向新的对象,⽽⾮通过名字改变对象状态。名字查找顺序: locals -> enclosing function -> globals -> __builtins__• locals: 函数内部名字空间,包括局部变量和形参。• enclosing function: 外部嵌套函数的名字空间。• globals: 函数定义所在模块的名字空间。• __builtins__: 内置模块的名字空间。如果不修改全局变量也可以不使用global关键字。Python3 提供了 nonlocal 关键字,用来修改外部 嵌套函数名字空间, python2.7 没有。nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
*************************************************************
'''
x, y = 1, 2  # 在模块级别直接定义的全局变量def test321():global x    # 引用全局变量x = 11y = 21      # 这里的 y 是局部变量global z    # 在函数内部定义一个全局变量,而没有在模块级别定义z = 3print(' in test321(): x=%d; y=%d; z=%d' % (x, y, z))def test322():print(' in test322(): x=%d; y=%d ; z=%d' % (x, y, z))    # 直接访问所有全局变量,包括变量z# 测试
print('        out 1: x=%d; y=%d;  z=undefine' % (x, y))
test321()
test322()
print('        out 2: x=%d; y=%d ; z=%d' % (x, y, z))'''
*************************************************************
3.3 闭包闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
*************************************************************
'''def lineConfig(a,b):'''这个例子中,函数line与环境变量a,b构 成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个环境变量的取值,这样我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。>>> y1 = lineConfig(1, 1)   # 定义直线 y = x + 1>>> p1 = y1(2)              # 计算y坐标,获取x=2时y1的值>>> print(p1)3>>> lstPoint = [y1(x) for x in range(3)] # 计算y坐标列表>>> print(lstPoint)[1, 2, 3]>>> y2 = lineConfig(4, 5)   # 定义直线 y = 4x + 5>>> p2 = y2(x=2)            # 计算y坐标,获取x=2时y2的值>>> print(p2)13'''def line(x):return a*x + breturn linedef newCounter(i=0):'''两个独立的计数器>>> c1 = newCounter()>>> c2 = newCounter(2)>>> print(c1(),c1(),c1())1 2 3>>> print(c2(),c2(),c2())3 4 5'''def counter():nonlocal ii = i + 1return ireturn counterif __name__ == '__main__':import doctestdoctest.testmod(verbose=True)

  

转载于:https://www.cnblogs.com/atsats/p/7747552.html

使用doctest单元测试方式培训讲解:Python函数基础相关推荐

  1. python必备基础代码-新手上路必学的Python函数基础知识,全在这里了(多段代码举例)...

    原标题:新手上路必学的Python函数基础知识,全在这里了(多段代码举例) 导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写 ...

  2. Python函数基础教程-张明阳-专题视频课程

    Python函数基础教程-730人已学习 课程介绍         通过本次课程的讲解,可以让大家对Python函数章节中的装饰器.闭包.函数对象.迭代器和生成器进行彻底的了解,在授课的过程中,将会结 ...

  3. Python函数基础练习

    Python函数基础练习 1. 输入一行字符,统计其中有多少个单词,每两个单词之间以空格隔开,并将输入字符按首字母大写居中,每个单词首字母大写左对齐,全小写,全大写右对齐的方式分别输出.如输入: Th ...

  4. ❤️用一万字给小白全面讲解python编程基础问答❤️《记得收藏不然看着看着就不见了》

    ❤️用一万字给小白全面讲解python编程基础问答❤️<

  5. python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱

    这篇文章主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数.默认参数.可变参数和关键字参数来讲,要的朋友可以参考下 C++里函数可以设置缺省参数,Java不可以,只能 ...

  6. python默认参数只被解释一次_深入讲解Python函数中参数的使用及默认参数的陷阱...

    C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不 ...

  7. 第三章 Python函数基础及进阶

    第三章 函数基础及进阶 3.1 上章补充内容 3.1.1 Bytes类型 计算机的数据需要存到硬盘上,但是硬盘只能存储二进制的数据. 我们知道将计算机里的数据转换成我们能看懂的数据是将二进制 -> ...

  8. 新手上路必学的Python函数基础知识,全在这里了(多段代码举例)

    导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写一个可复用的函数.通过给一组Python语句一个函数名,形成的函数可以帮助你 ...

  9. 【RF基础】RF调用python函数基础

    文章目录 构建 运行 本文简单介绍了如何在robot里面调用一个python写的函数. 构建 我们在D盘下创建两个文件,一个叫pyfile.py,用于编写python函数,另外一个叫test.txt, ...

最新文章

  1. JavaScript,25 岁生日快乐!
  2. android log4,GitHub - oronno/log4android: Log4Android - Simple Logging Wrapper Library for Android
  3. Qt实现Matlab的等差函数linSpace
  4. 厉害了!用 JS 实现人脑和计算机交互
  5. [转] 前端中的MVC
  6. Objects.requireNonNull 方法说明
  7. supersr--图形上下文的注意点
  8. [学习笔记] [数据分析] 01.Python入门
  9. dbvisulizer 存储过程
  10. Linux 内存泄漏检查工具 valgrind
  11. IBGP的自己下一跳,指定源命令。
  12. 精读CSS权威指南第四版(4)
  13. 9款常用的数据可视化工具推荐
  14. 需求分层-KANO模型解读
  15. 对讲机扫盲的基本常识
  16. WebSphere 环境搭建
  17. LZY最喜欢的思维题
  18. R语言—Shiny框架
  19. 一台计算机英语美式发音,美式英语发音课程(视频+文本) 第69期:Want和Won't的发音对比...
  20. 数据挖掘与机器学习经典书目

热门文章

  1. win7如何设置通电自动开机_电脑自动开机,教您怎么设置电脑自动开机
  2. 吴恩达机器学习笔记:(一)机器学习方法简介
  3. 【直播课】TensorRT工程落地实践:快速掌握模型优化部署
  4. 全球及中国油气装备行业投资状况及运营前景研究报告2021版
  5. Centos6.6下安装配置Redmine详解
  6. KeyUsage Extension The KeyUsage extension defines the following variables, which correlate directly
  7. java pkcs#11读取证书加解密(初学-分享)
  8. 实用:Google Chrome 键盘快捷键大全
  9. git命令行删除远程分支
  10. 【原创】大数据基础之Ambari(1)简介、编译安装、使用