1. python函数

不同于其他语言,python支持函数返回多个值

为函数提供说明文档:help(函数名)或者函数名.doc

  1. def str_max(str1, str2):
  2. '''
  3. 比较两个字符串的大小
  4. '''
  5. str = str1 if str1 > str2 else str2
  6. return str
  7. help(str_max)
  8. print(str_max.__doc__)
  1. Help on built-in function len in module builtins:
  2. len(obj, /)
  3. Return the number of items in a container.
  4. out[2]:'Return the number of items in a container.'

2. python函数值传递和引用(地址)传递

  1. 值传递:适用于实参类型为不可变类型(字符串、数字、元组);
  2. 引用传递:适用于实参类型不可变类型(列表、字典);
  3. 值传递和引用传递的区别:函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数进行引用传递后,改变形参的值,实参的值一会一同改变。
  1. def demo(obj)
  2. obj += obj
  3. print("形参值为:"obj)
  4. print("---值传递---")
  5. a = "孙悟空"
  6. print("a的值为:"a)
  7. demo(a)
  8. print("实参值为:"a)
  9. print("---引用传递---")
  10. a = [1, 2, 3]
  11. print("a的值为:"a)
  12. demo(a)
  13. print("实参值为:"a)
  1. 运行结果为:
  2. -------值传递-----
  3. a的值为: 孙悟空
  4. 形参值为: 孙悟空孙悟空
  5. 实参值为: 孙悟空
  6. -----引用传递-----
  7. a的值为: [1, 2, 3]
  8. 形参值为: [1, 2, 3, 1, 2, 3]
  9. 实参值为: [1, 2, 3, 1, 2, 3]

3. python函数参数传递机制

  1. 值传递

    所谓值传递,实际上就是将实际参数值的副本(复制品)传入函数,而参数本身不会受到任何影响。
  2. 引用传递

    如果实参的数据类型是可变对象(列表、字典),则函数参数的传递方式将采用引用传递方式。引用传递的底层实现,采用的依然是值传递的方式。

4. python函数关键字参数

  1. def dis_str(str1, str2):
  2. print("str1:", str1)
  3. print("str2:", str2)
  4. #位置参数
  5. dis_str("python", "c++")
  6. #关键字参数
  7. dis_str(str2 = "c++", str1 = "python")
  8. #混合参数
  9. dis_str("c++", str2 = "python")
  10. #混合传参,关键字参数必须位于所有的位置参数之后

5. python函数默认参数

注意:指定有默认值的形式参数必须在所有没默认参数的最后。

  1. def dis_str(str1, str2 = "python"):
  2. print("str1:", str1)
  3. print("str2:", str2)
  4. dis_str("c++")
  5. dis_str("c++", "python")

python中可以使用"函数名.defaults"查看函数的默认值参数的当前值,其返回值是一个元组。

  1. print(dis_str.__defaults__)
  2. #执行结果为
  3. ('python',)

6. python可变参数*args和**kwargs

*args和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。

1.*args用来传递一个非键值对的可变数量的参数列表给一个函数

  1. def test(f_arg, *args):
  2. print("first normal arg:", f_arg)
  3. for arg in args:
  4. print("another arg through *args:", arg)
  5. test("python", "c++", "java", "c")
  6. #执行结果为
  7. first normal arg: python
  8. another arg through *args: c++
  9. another arg through *args: java
  10. another arg through *args: c

2.**kwargs允许将不定长度的键值对,作为参数传递给一个函数。如果想在一个函数里处理带名字的参数,应该使用**kwargs

  1. def names(**kwargs):
  2. for key, value in kwargs.items():
  3. print("{0} == {1}".format(key, value))
  4. names(name = "xiaobai")
  5. #执行结果为
  6. name == xiaobai

7. python逆向参数收集

所谓逆向参数收集,指的是在程序已有列表、元组、字典等对象的前提下,把它们的元素"拆开"后传给函数的形参。

逆向参数收集需要在传入的列表、元组参数之前添加一个星号,在字典参数之前添加两个星号。

  1. def test(name, message):
  2. print("用户是:", name)
  3. print("欢迎信息:", message)
  4. my_list = ["小白", "欢迎来到上海"]
  5. test(*my_list)
  6. #执行结果为
  7. 用户是: 小白
  8. 欢迎信息: 欢迎来到上海

实际上,即使是可变参数,如果程序需要将一个元组传给该函数,那么同样需要使用逆向收集。

  1. def test(name, *nums):
  2. print("name参数:", name)
  3. print("nums参数:", nums)
  4. my_tuple = (1, 2, 3)
  5. test("小白", *my_tuple)
  6. test(*my_tuple)
  7. #执行结果为
  8. name参数: 小白
  9. nums参数: (1, 2, 3)
  10. #执行结果为
  11. name参数: 1
  12. nums参数: (2, 3)
  1. def test(book, price, des):
  2. print(book, "价格是:", price)
  3. print("描述信息:", des)
  4. my_dict = {'price':159, 'book':'西游记', 'des':'师徒四人西天取经'}
  5. test(**my_dict)
  6. #执行结果为
  7. 西游记 价格是: 159
  8. 描述信息: 师徒四人西天取经

8. python partial偏函数

偏函数是对原始函数的二次封装,是将现有函数的部分参数设置默认值,从而得到一个新的函数,相比原函数,偏函数具有较少的可变参数,从而降低了函数调用的难度。

  1. from functools import partial
  2. def display(name, age):
  3. print("name:", name, "age:", age)
  4. #定义偏函数
  5. xiaobai = partial(display, name = 'xiaobai')
  6. #由于name已经有默认值,因此调用偏函数时,可以不指定
  7. xiaobai(age = 10000)
  8. #执行结果为
  9. name: xiaobai age: 10000

偏函数通过将任意数量的参数,转化为另一个带有剩余参数的函数对象,从而实现了截取函数功能的效果。

9. python局部变量和全局变量

1.定义全局变量的两种方式

  1. name = "xiaobai"
  2. def print_name(name):
  3. global age
  4. age = 10
  5. print("函数体内访问:", name, age)
  6. print_name(name)
  7. print("函数体外访问:", name, age)
  8. #执行结果为
  9. 函数体内访问: xiaobai 10
  10. 函数体外访问: xiaobai 10
  11. #注意:在使用global关键字修饰变量名时,不能直接给变量赋值,否则会引发语法错误。

2.获取指定作用域(scope)范围中的变量

  1. # 1.globals()函数返回一个包含全局范围内所有变量的字典
  2. #全局变量
  3. name = "xiaobai"
  4. age = 10
  5. def test():
  6. #局部变量
  7. name1 = "xiaohei"
  8. age1 = 20
  9. print(globals())
  10. #执行结果为
  11. {..., 'name':'xiaobai', 'age':10, ...}
  12. # 2.locals()函数得到一个包含当前作用域内所有变量的字典。即在函数内部调用locals()得到包含所有局部变量的字典,在全局范围内调用locals()函数和globals()函数相同。
  13. # 3.vars()函数返回一个指定object对象范围内所有变量组成的字典,如果不传入object对象,vars()和locals()的作用完全相同。

10. python函数的高级用法(赋值、作为其他函数的参数、作为其他函数的返回值)

1.将函数赋值给其他变量,这样,程序中可以使用其他变量来调用该函数。

  1. def my_fun():
  2. print("正在执行my_fun函数")
  3. #将函数赋值给其他变量
  4. other = my_fun
  5. #间接调用my_fun()函数
  6. other()
  7. #执行结果
  8. 正在执行my_fun函数

2.将函数以参数的形式传入其他函数中。

  1. def add(a, b):
  2. return a + b
  3. def my_fun(a, b, dis):
  4. return dis(a, b)
  5. print(my_fun(3, 4, add))
  6. #执行结果
  7. 7

3.将函数作为其他函数的返回值。

  1. def my_fun():
  2. #局部函数
  3. def infun():
  4. print("调用局部函数")
  5. #调用局部函数
  6. return infun
  7. other_fun = my_fun()
  8. #调用局部的infun()函数
  9. other_fun()
  10. #执行结果
  11. 调用局部函数

11. python闭包(闭包函数或闭合函数)

闭包函数和嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。

  1. #闭包函数,其中exponent称为自由变量
  2. def nth_power(exponent):
  3. def exponent_of(base):
  4. return base ** exponent
  5. return exponent_of #返回值是exponent_of函数
  6. square = nth_power(2)
  7. cube = nth_power(3)
  8. print(square(2))
  9. print(cube(2))

闭包函数比普通函数多了一个__closure__属性,该属性记录着自由变量的地址。当闭包被调用时,系统就会根据该地址找到对应的自由变量,完成整体的函数调用。

  1. def nth_power(exponent):
  2. def exponent_of(base):
  3. return base ** exponent
  4. return exponent_of
  5. square = nth_power(2)
  6. print(square.__closure__)
  7. #执行结果
  8. (<cell at 0x0000019F2EA25828: int object at 0x00007FFCDBFAEF20>,)

可以看到,显示的内容是一个int整数类型,这就是square中自由变量exponent的初始值。还可以看到,__closure__属性的类型是一个元组,这表明闭包可以支持多个自由变量的形式。

12. python lambda表达式(匿名函数)

  1. res = lambda x, y : x + y

1.对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁

2.对于不需要多次使用的函数,使用lambda表达式可以在用完之后立即释放,提高程序执行的性能

13. python eval()和exec()函数

这两个函数都可以执行一个字符串形式的python代码,相当于一个python的解释器。二者不同之处在于,eval()执行完要返回结果,而exec()执行完不返回结果。

  1. dic={} #定义一个字
  2. dic['b'] = 3 #在 dic 中加一条元素,key 为 b
  3. print (dic.keys()) #先将 dic 的 key 打印出来,有一个元素 b
  4. exec("a = 4", dic) #在 exec 执行的语句后面跟一个作用域 dic
  5. print(dic.keys()) #exec 后,dic 的 key 多了一个
  6. #执行结果
  7. dict_keys(['b'])
  8. dict_keys(['b', '__builtins__', 'a'])

13. python函数式编程(map(), filter(), reduce())

1.map()函数

map()函数对可迭代对象中的每个元素,都调用指定的函数,并返回一个map对象。

注意:该函数返回的是一个map对象,不能直接输出,可以通过for循环或者list()函数来显式。

  1. nums = [1, 2, 3, 4]
  2. res = map(lambda x : x ** 3, nums)
  3. print(res)
  4. print(list(res))
  5. #执行结果
  6. <map object at 0x0000013B6A2A24A8>
  7. [1, 8, 27, 64]

2.filter()函数

filter()函数对每个可迭代对象,都使用function函数判断,并返回True或者False,最后将返回True的元素组成一个新的可遍历的集合。

  1. nums = [1, 2, 3, 4]
  2. res = filter(lambda x : x % 2 == 0, nums)
  3. print(res)
  4. print(list(res))
  5. #执行结果
  6. <filter object at 0x0000013B6A2A24E0>
  7. [2, 4]

3.reduce()函数

reduce()函数用来对一个集合做累积操作。

注意:reduce()函数已经被移除,放入了functools模块。

  1. import functools
  2. nums = [1, 2, 3, 4, 5]
  3. res = functools.reduce(lambda x, y : x * y, res)
  4. print(res)
  5. #执行结果
  6. 24

14. 提高代码可读性和颜值的几点建议

  1. 不写重复性代码
  2. 刻意减少代码的迭代层数,尽可能让python代码扁平化
  3. 函数的粒度应该尽可能细,不要让一个函数做太多的事情

python函数和lambda表达式学习笔记的更多相关文章

  1. python函数,lambda表达式,三目运算,列表解析,递归

    一.自定义函数 定义函数时,函数体不执行:只有在调用函数时,函数体才执行.函数的结构: 1. def 2. 函数名 3. 函数体 def func_name(): 函数体 4. 返回值 如果没有声明返 ...

  2. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  3. C# Lambda表达式学习笔记

    本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用.     一.Lambda ...

  4. Python函数与lambda 表达式(匿名函数)

    Python函数 一.函数的作用 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段 函数能提高应用的模块性和代码的重复利用率 python 内置函数:https://docs.pytho ...

  5. (7)python 函数和lambda表达式

    一.函数定义和调用 1.定义函数用def 2.函数注释 在函数体里的开头写上字符串,可以起到说明的作用 可以用函数名.__doc__的方式读取在函数开头加的字符串(双下划线) 内建的help()函数也 ...

  6. Lambda表达式学习笔记

    Lambda基础语法 Java8中引入了一个新的操作符" -> ",该操作符被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分: 左侧:Lamb ...

  7. lambda 表达式学习笔记

    在Java中传递一个代码段并不容易,不能直接传递代码段.Java是一个面向对象语言,所以必须构造一个对象,这个对象的类需要一个方法能包含所需的代码.lambda的出现有效的解决这个问题,让代码变得更加 ...

  8. Python运算和和表达式 学习笔记

    光荣之路Python公开课第二讲 Python运算符和表达式. 一 Python运算符 Python运算符包括 算术运算符,赋值运算符,位运算符,逻辑运算符,身份运算符,成员运算符. 1. 算术运算符 ...

  9. Python内嵌函数与Lambda表达式

    //2018.10.29 内嵌函数与lambda 表达式 1.如果在内嵌函数中需要改变全局变量的时候需要用到global语句对于变 量进行一定的说明与定义 2.内部的嵌套函数不可以直接在外部进行访问 ...

随机推荐

  1. H3C VLAN配置示例

  2. Linux 内核 MODULEDEVICETABLE 宏

    这个 pci_device_id 结构需要被输出到用户空间, 来允许热插拔和模块加载系统知道什 么模块使用什么硬件设备. 宏 MODULE_DEVICE_TABLE 完成这个. 例如: MODULE_ ...

  3. vue-learning:31 - component - 组件间通信的6种方法

    vue组件间通信的6种方法 父子组件通信 prop / $emit 嵌套组件 $attrs / $liteners 后代组件通信 provide / inject 组件实例引用 $root / $pa ...

  4. 2019前端学习路线心得-黑马程序员pink老师

    在规划之前先给大家分享几点心得哈: 1. 学习,特别是在线学习,是非常辛苦的事情,为了少走弯路, 所以一定要系统学习,多借鉴与前辈们总结出来的经验. 2. 不要相信任何说 一周掌握 css, 一周学完 ...

  5. Oracle生成批量清空表数据脚本

    select 'DELETE FROM ' || a.table_name || '; --' || a.comments from user_tab_comments a where a.table ...

  6. Channel 9视频整理【3】

    Will 保哥 微软mvp https://channel9.msdn.com/Niners/Will_Huang 繁体中文视频 Visual Studio 2017 新功能探索 https://ch ...

  7. 创意app1

      app名称: 与我相似的人 app目的: 旨在通过云匹配,搜索到与自己类似爱好或者性格的人用户相似的内容:衣服品牌鞋子手机笔记本键盘鼠标相机刮胡刀自行车工作  说明: 现有的格局 百度贴吧是面向多 ...

  8. cglib的使用

    前言 最近一直在看Spring源码,其实我之前一直知道AOP的基本实现原理: 如果针对接口做代理默认使用的是JDK自带的Proxy+InvocationHandler 如果针对类做代理使用的是Cgli ...

  9. JLINK、ULINK和STlink仿真器详解

    JLink仿真器 德国SEGGER公司推出基于JTAG的仿真器.简单地说,是给一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag ...

  10. hibernate 大对象类型的hibernate映射

    在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 j ...