我的施工之路

目前已完成,以下五期Python专题总结:

1我的施工计划

2数字专题

3字符串专题

4列表专题

5流程控制专题

6编程风格专题

今天是Python函数专题,目录结构:

  • Python 函数专题

  • 基础部分

    • 1 函数组成

    • 2 引用传参

    • 3 默认参数与关键字参数

    • 4 可变参数

    • 5 内置函数

  • 进阶部分

    • 6 偏函数

    • 7 递归函数

    • 8 匿名函数

    • 9 高阶函数

    • 10 嵌套函数

  • 总结

Python 函数专题

函数是一个接受输入、进行特定计算并产生输出的语句集。

我们把一些经常或反复被使用的任务放在一起,创建一个函数,而不是为不同的输入反复编写相同的代码。

Python提供了printsortedmaxmap等内置函数,但我们也可以创建自己的函数,称为用户定义函数。

基础部分

1 函数组成

如下自定义函数:

def foo(nums):""" 返回偶数序列"""evens = []for num in nums:if num%2==0:evens.append(num)return evens

可以看到函数主要组成部分:

  • 函数名:foo

  • 函数形参:nums

  • :: 函数体的控制字符,作用类似JavaC++的一对{}

  • 缩进:一般为4个字符

  • """:为函数添加注释

  • return: 函数返回值

以上函数求出列表nums中的所有偶数并返回,通过它了解Python函数的主要组成部分。

2 引用传参

定义好一个函数后,使用:函数名+()+实参,调用函数,如下方法:

foo([10,2,5,4])

其中[10,2,5,4]为实参,它通过by reference方式传给形参nums,即nums指向列表头,而不是重新复制一个列表给nums.

再看一个引用的例子:

def myFun(x): x[0] = 20

如下调用:

lst = [10, 11, 12, 13, 14, 15]
myFun(lst)

实参lst和形参x都指向同一个列表:

因此,对x[0]修改实际就是对实参lst的修改,结果如下:

但是,有时在函数内部形参指向改变,因此实参与形参的指向分离,如下例子:

def myFun(x):  x = [20, 30, 40]x[0] = 0

调用:

lst = [10, 11, 12, 13, 14, 15]
myFun(lst)

x 被传参后初始指向lst,如下所示:

但是,执行x = [20, 30, 40]后,对象x重新指向一个新的列表对象[20,30,40]

因此,对于x内元素的任何修改,都不会同时影响到lst,因为指向已经分离。

3 默认参数与关键字参数

Python函数的参数,可以有初始默认值,在调用时如果不赋值,则取值为默认值,如下例子:

def foo(length,width,height=1.0):return length*width*height

调用foo函数,没有为height传参,所以取为默认值1.0

r = foo(1.2,2.0)
print(r) # 2.4

使用默认值有一点需要区分,有的朋友会与关键字参数混淆,因为它们都是para=value的结构,但是有一个很明显的不同:默认值是声明在函数定义时,关键字参数是在函数调用时使用的此结构。如下例子:

def foo(length,width,height=1.0): # height是默认参数return length*width*heightfoo(width=2.0,length=1.2) #确定这种调用后才确定width和length是关键字参数

确定以上调用后,才确定widthlength是关键字参数,并且关键字参数不必按照形参表的顺序调用。

4 可变参数

JavaC++在解决同一个函数但参数个数不同时,会使用函数重载的方法。Python使用可变参数的方法,非常灵活。

可变参数是指形参前带有*的变量,如下所示:

def foo(length,*others):s = lengthfor para in others:s *= parareturn s

我们可以像下面这样方便的调用:

foo(1.2,2.0,1.0) # 2.4

如上,带一个星号的参数被传参后,实际被解释为元组对象。我们还可以这样调用:

foo(1.2) # 1.2

5 内置函数

总结完函数的参数后,再举几个Python内置的常用函数。

pow

大部分朋友应该知道pow是个幂次函数,比如求:

pow(2,3)

除此以外,pow还有第三个参数,使用更高效的算法实现求幂后再求余数:

pow(2,3,5) # 3

max,min

max,min用来求解最大最小值,实现relu函数:

def relu(x):return max(x,0)

sorted

sorted函数完成对象排序,它能接收一个指定排序规则的函数,完成定制排序。如下,根据字典值绝对值从小到大排序:

d = {'a':0,'b':-2,'c':1}
dr = sorted(d.items(),key=lambda x:abs(x[1]))
print(dr) # [('a', 0), ('c', 1), ('b', -2)]

进阶部分

Python有一个专门操作函数的模块:functools,能实现一些关于函数的特殊操作。

6 偏函数

偏函数固定函数的某些参数后,重新生成一个新的函数。

通常用法,当函数的参数个数太多,需要简化时,使用partial创建一个新的函数。

假设我们要经常调用int函数转换二进制字符,设置参数base为2:

int('1010',base=2)

为了避免每次都写一个参数base,我们重新定义一个函数:

def int2(s):return int(s,base=2)

以后每次转化字符串时,只需int2('1010)即可,更加简便。

偏函数也能实现上述功能:

from functools import partialintp = partial(int,base=2)

那么有的朋友会问,偏函数就是个鸡肋,重新定义的int2更加直观容易理解,这个角度讲确实是这样。但是int2不能再接收base参数,但是intp函数还是能接收base参数,依然保留了原来的参数:

intp('10',base=16) # 16

可能看到这里的读者还是有些迷糊,不太确定怎么使用偏函数。可以先记住:修改内置函数的默认参数,就像内置函数int默认参数base等于10,使用偏函数调整默认base值为2.

7 递归函数

递归函数是指调用自身的函数。如下使用递归反转字符串:

def reverseStr(s): if not s:return s return reverseStr(s[1:])+s[0]print(reverseStr('nohtyp')) # python

reverseStr函数里面又调用了函数reverseStr,所以它是递归函数。

使用递归函数需要注意找到正确的递归基,防止陷入无限递归。

更多使用递归的例子大家可参考此公众号之前推送。

8 匿名函数

匿名函数是指使用lambda关键字创建的函数。它的标准结构如下:

lambda 形参列表: 含有形参列表的表达式

表达式的计算值即为lambda函数的返回值。

如下lambda函数:

lambda x,y: x+y

它等价于下面的f函数:

def f(x,y):return x+y

lambda函数常做为max,sorted,map,filter等函数的key参数。

9 高阶函数

可以用来接收另一个函数作为参数的函数叫做高阶函数。

如下f有一个参数g,而g又是函数,所以f是高阶函数:

def f(g):g()

Python 中经常会遇到高阶函数,今天介绍几个内置的常用的高阶函数。

map

map 函数第一个参数为函数,它作用于列表中每个的元素。

如下,列表中的单词未按照首字母大写其他字符小写的规则,使用map一一capitalize每个元素:

m = map(lambda s: s.capitalize(), ['python','Very','BEAUTIFUL'])
print(list(m))

结果:

['Python', 'Very', 'Beautiful']

reduce

reduce 高阶函数实现化简列表,它实现的效果如下:

如下例子,函数f等于x+y,求得两数之和,然后再与第三个数相加,依次下去,直到列表尾部,进而得到整个列表的和:

from functools import reduce def f(x,y):return x+yr = reduce(f, [1,3,2,4])
print(r) # 10

以上reduce求解过程等于:

需要注意:reduce函数要求f必须带2个参数,只有这样才能完成归约化简。

10 嵌套函数

嵌套函数是指里面再嵌套函数的函数。

如下例子,将列表转化为二叉树。已知列表nums

nums = [3,9,20,None,None,15,7],转化为下面二叉树:

二叉树定义:

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None

构建满足以上结构的二叉树,可以观察到:树的父节点和左右子节点的关系:

基于以上公式,再使用递归构建二叉树。

递归基情况:

if index >= len(nums) or nums[index] is None:return None

递归方程:

根据以上分析,得到如下代码,list_to_binarytree函数是嵌套函数,它里面还有一个level子函数:

def list_to_binarytree(nums):def level(index):if index >= len(nums) or nums[index] is None:return Noneroot = TreeNode(nums[index])root.left = level(2 * index + 1)root.right = level(2 * index + 2)return rootreturn level(0)binary_tree = list_to_binarytree([3,9,20,None,None,15,7])

通常使用嵌套函数的场景:实现一个功能只需要编写2个函数,写成一个class好像显得有些不必要,写成嵌套后更简洁,并且某些参数能共享,亲和性会更好。不妨体会上面的nums参数。

总结

函数专题主要总结了以下:

  • Python 函数专题

  • 基础部分

    • 1 函数组成

    • 2 引用传参

    • 3 默认参数与关键字参数

    • 4 可变参数

    • 5 内置函数

  • 进阶部分

    • 6 偏函数

    • 7 递归函数

    • 8 匿名函数

    • 9 高阶函数

    • 10 嵌套函数

  • 总结

《end》

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:

【Python基础】Python 函数使用总结相关推荐

  1. python的用途实例-Python基础之函数原理与应用实例详解

    本文实例讲述了Python基础之函数原理与应用.分享给大家供大家参考,具体如下: 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体 ...

  2. Python基础之函数

    详情请戳 python基础之函数介绍及使用 python基础之内置函数 python基础之迭代器和生成器 python基础之装饰器 转载于:https://www.cnblogs.com/zhangl ...

  3. Python数据结构与算法(1.5)——Python基础之函数与异常

    Python数据结构与算法(1.5)--Python基础之函数与异常 0. 学习目标 1. 函数 1.1 自定义函数 1.2 函数与参数 1.3 函数与返回值 2. 异常处理 2.1 raise 语句 ...

  4. python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值

    python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值 一 .函数概念 函数是根据需要,将代码打包为代码块, 每一个代码块就可以封装为一个函数 ...

  5. Python基础-Python基础使用

    Python基础-Python基础使用 1.Python解释器 在Python文件的开头加入以下代码就制定了解释器. #!/usr/bin/env python # _*_ coding:utf-8 ...

  6. 刻意练习:Python基础 -- Task05. 函数与Lambda表达式

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  7. Python基础__函数

    本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍. 函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调 ...

  8. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  9. 『Python基础』函数

    Python中的函数 函数 (1)什么是函数? 软件开发,是为了解决生活中的问题,函数就是生活中的一种行为,如:吃饭.睡觉.学习.游戏等等等- 不需要资源.不需要结果.执行即可 关门的行为 需要资源. ...

  10. 第七篇 python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...

最新文章

  1. 4.Ling初体验 匿名类型在查询表达式中的使用
  2. Spring Security 实战干货: RBAC权限控制概念的理解
  3. Enable-Migrations出错
  4. python抽奖游戏大全_抽奖游戏
  5. 读书几年收藏的编程利器网站,给大家分享出来
  6. Linux系统安全工具tcpdump用法
  7. 恢复快速启动栏里的“显示桌面”图标
  8. Go中数字转换字符串的正确姿势
  9. leetcode--57--Insert Interval
  10. java内部类简单解析
  11. salesforce 零基础学习(三十二)通过Streams和DOM方式读写XML
  12. 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)
  13. 常见的Markdownpad2运行破解以及This view has crashed!报错和Awesomium1.6.6SDK安装使用
  14. PS抠发丝简单详细方法
  15. 如何将文件自动一传到服务器,Windows文件传输篇:怎么上传文件到服务器?
  16. 微擎-人人商城接入Facebook授权登录
  17. 那些年,我们一起玩过的儿童游戏
  18. PATA1034题解
  19. ubuntu系统损坏修复_修复损坏的ubuntu gui
  20. SQL SERVER 软件和安装步骤

热门文章

  1. quartz数据库方式与web工程整合
  2. spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现
  3. UOJ#310.【UNR #2】黎明前的巧克力(FWT)
  4. Github使用初体验2018.08.07
  5. POJ2142-The Balance【扩欧】
  6. 【java/C# 服务器】IOS 配置推送证书 p12文件流程 - 勿以己悲
  7. DirectShow学习
  8. WEB页面多语言支持解决方案(转自CSDN)
  9. android手机短信拦截器,垃圾短信退订套路深 手机上装拦截软件是可行方法
  10. 单细胞数据库PanglaoDB使用指南