前面讲了很多内容都是关于python的变量,数据结构,下面我们来谈一谈python的函数。python里的函数知识点大概分为基础的定义使用,作用域和参数传递,高级用法,其中参数传递最为灵活,作用域最为绕人.

函数其实是对程序逻辑进行结构化或者过程化的一种编程方法,把整块的代码巧妙的隔离成易于管理的小块,是最基本的一种代码抽象的方式。

python函数是用def关键字定义的:

def算是函数的头,头上一般会有一个函数名,后面跟0个或者多个参数
然后是函数的身体,这个代码块就是函数的主体部分,一般会缩进写
最后是函数的尾巴包含一个return语句,返回一个对象的表达式.
今天我们先来说一说里面的一些小花招,算是给初学者的开胃菜,为后面正式讲函数热热身:

1.Python函数可以返回多个值

一般的编程语言比如c,c++,java,一般返回的都是一个值,python可以返回多个值(perl其实也可以),因为有的时候我们除了需要函数返回计算的结果,我们还需要返回一些操作的状态,看个简单的例子你就明白了 :

这个getHtmlResponse()函数可以返回多个值,第一值是返回处理的状态True or false,第二值是msg,有的时候我们需要先判断状态,若true 就不管了,若是false再进一步处理.

这样的场景下用函数返回多个值这个特性很容易搞定.原理其实就是函数返回了一个元组,然后把结果赋值给多个变量。

说到这里,我穿插一个小技巧,我的时候我们希望丢弃掉一些返回值,

我们可以用_搞定(用一个几乎用不到的变量名,来作为要丢弃的值的名称)

2.尽量用异常表示特殊情况,不要返回None

python函数若你什么都不return,默认返回None,很容易忽视这一点

有的同学说我写函数代码,会记得加上None,但是有的时候返回None也会让你误解,不好处理,你不信我们看下面一个例子:

原因是当分子为0的时候,计算结果为0,那这个结果去做条件判断时,会出现问题,会弄巧成拙。其实你返回None是有特殊意义的,是为了判断分母为0.

解决这个问题有两个办法:第一个是把返回值拆成两部分,返回一个元组,第一个元素是操作是否成功,第二个是运行结果,改成如下:

第二个好的办法是:根本不返回None,直接抛异常给上一级,使得调用者必须应对它,好我们来改一下代码看看:

# 异常部分后面会讲,valueError是异常中的一种,表示传给函数的参数类型不正确

现在调用者就需要处理因输入值无效而引发的异常,而不需要用条件语句去判断函数的返回值,非常清晰而且不容易混淆.

3.匿名函数

python除了def语句之外,还提供了一中懒人专用的函数叫做lambda,有点LISP语言的风格(LISP是一个非常著名的黑客语言).所以称为lambda匿名函数,其实就想def一样,这个表达式创建了一个能够调用的函数,它其实是返回一个函数而不是像传统的函数赋值给一个变量名,所以一般都是在一种行内进行使用.

形式:

lambda arg1,arg2...argN:expression using arg

  • lambda是一个表达式,而不是一个语句
    作为一个表达式,经常在列表中或者函数中调用,能够出现在python语法不允许出现def的地方.此外做为一个表达式lambda返回了一个值(新的函数),可以选择性的赋值给一个变量名。
  • lambda的主体是单个的表达式,而不是代码块
    lambda的主体简单的就像放在def主体的return 里的代码一样,写成一个表达式,lambda通常比def功能要小,只能封装一些有限的逻辑,lambda为简单任务而生,def则处理更大更复杂的任务.

对比一下吧:

  • 普通函数

  • 匿名函数

在比如在排序对数据整理时经常用到:

也许懒惰也是推进人类进步的一大利器,当年因为懒惰嫌Dos太麻烦才有了win,当年的手机系统因为懒惰希望不用键盘直接手点点多好才有了触摸屏,因为懒惰懒的打字才推进了语音识别.

4.警惕默认参数的潜在问题

最后一个花招是很具有迷惑性的,一定要看仔细,一般我们在函数参数传递的时候,希望用一种非静态的类型来作为关键字的默认值,比如我们经常会有打印日志消息的函数:

奇怪两条消息戳是一样的,这是因为datetime.datetime.now()只执行了一次,也就是说在函数定义的时候执行了一次。参数的默认值会在每一个模块加载进来的时候求出,一旦这段模块加载进来了,参数的默认值就很固定了,程序不会再出执行datetime.datetime.now()

是不是觉得很冤枉,明明想动态的一下的,反而变成了静静~~ 肿么办

这里有一个小技巧,在Python中若你想动态实现默认值,习惯把默认值改成None,然后加一些注释,看代码吧:

现在两条消息的时间戳就不同了,如果参数的实际默认值是可变类型,切记切记用None作为形式上的默认值.

好了函数里的小花招就讲到这里啦,希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.

分享几个Python小技巧函数里的4个小花招 1相关推荐

  1. 分享几个Python小技巧函数里的4个小花招

    前面讲了很多内容都是关于python的变量,数据结构,下面我们来谈一谈python的函数.python里的函数知识点大概分为 基础的定义使用 , 作用域 和 参数传递 , 高级用法 ,其中参数传递最为 ...

  2. python高效开发实战配套源文件_分享12个python使用技巧,助你轻松掌握Python高效开发...

    前言: 欢迎大家收看分享12个python使用技巧,助你轻松掌握Python高效开发!部分代码用图片的方式呈现出来,方便各位观看与收藏,要是喜欢的话,记得一定不要忘记点赞关注嗷! 内容如下: 1. 隐 ...

  3. excel怎么设置打印区域_Excel使用小技巧-Excel里设置打印区域

    --用最通俗的语言,从最基础的功能讲起,Excel小白学起来也毫无困难. 非常欢迎大家,我会定期分享一些Office办公软件相关的小知识小妙招,也会分享一些其他的小知识或者是一些比较好的文章.图集或者 ...

  4. python的init函数里参数的作用

    问题发现 一直有一个疑问,有时我们在继承时,在__init__函数会出现可变参数*arg或关键字参数**kw这样的参数,这些参数有什么用?如果有用,这些参数时如何传递?传递些什么? 注:如果你不知道什 ...

  5. excel求和为什么是0_Excel使用小技巧-Excel里的自动求和功能

    非常欢迎大家关注我的公众号,我会定期分享一些Office办公软件相关的小知识小妙招,也会分享一些其他的小知识或者是一些比较好的文章.图集或者视频. 也希望大家对我多多支持,如果大家有想了解的内容,也可 ...

  6. python中open()函数里中文处理

    Python中open()函数写和读中文处理 写入文件时: fp.write(u"中文".encode(''utf-8'')),中文前加u:读文件时:循环出的结果需解码用:f.de ...

  7. iphone清理缓存小技巧_那些不为人知的iPhone隐藏小技巧

    最近本小编在跟同事交流iPhone隐藏技巧过程中发现自己居然有好多功能都不知道,一度怀疑自己用的假苹果!!于是我就奋发图强.把网上一些比较有用的iPhone隐藏技巧搜索.整理了这篇,可能还是不全.希望 ...

  8. 学会了很多计算机小技巧,超实用的八个电脑小技巧,全都学会让你成为电脑高手...

    Part one 截屏 我们在使用电脑的过程中,有时候会使用截屏功能.Alt+Ctrl+A诶?怎么不行?原来这是QQ特有的快捷键,如果不登录QQ的话,是使用不了的.那么我们就只能先登录QQ,然后再一步 ...

  9. python常用技巧_python 实用的30个小技巧

    所有的这些技巧都能帮助你压缩代码并且优化运行.此外,你可以在日常工作中很容易地在真实项目中使用他们. 贴士#1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法 ...

  10. python撩妹小技巧 —— 30行代码实现520小彩蛋

    1 彩蛋效果展示: 网页上展示的效果可能不齐, 但是python上的输出是对齐的. 可能是不同平台的空格宽度不同的缘故 祝祝祝 脱脱脱 单单单 祝 脱 单 单 祝祝祝 脱脱脱 单 单祝 脱 单 单 祝 ...

最新文章

  1. 基础篇 第四节 项目进度计划编辑 之 任务关联性设定
  2. 【Codeforces】913C Party Lemonade (贪...)。
  3. Java程序片:Java复制文件
  4. ruby gem passenger依赖关系
  5. jmeter练习(5)关联升级版—ForEach控制器(提取多个响应结果并依次传参)
  6. 在 Chrome 控制台可以玩的两个骚操作,你知道吗?
  7. zuul网关找不到服务_网关zuul中对所有下游服务权限做控制zuulauth
  8. python+appium自动化测试-重复执行测试用例
  9. 已经安装mysql xampp_windows 7 本机已安装mysql5的情况上 安装XAMPP
  10. 利用iMazing将iOS设备的录音文件拷贝到电脑
  11. 《敏捷个人》周刊 第13期 (可下载)
  12. 【随笔 || 逐源·极简学习法】
  13. MapReduce----电信数据清洗
  14. python中hub_Python中文社区名称的统一
  15. Mi2上装的应用们,大家也可以分享下好的应用
  16. LeetCode/LintCode 题解丨一周爆刷双指针:寻找重复的数
  17. 集群中zeus平台的变更
  18. E-PUCK机器人-标准固件
  19. 爱帮网CEO刘建国:垂直化是搜索发展的趋势
  20. 中图分类号和UDC查询

热门文章

  1. Nginx资源合并优化模块nginx-http-concat
  2. 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程
  3. 10 步让你成为更优秀的Coder
  4. autotools 学习
  5. Java获取https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书
  6. java提取(获取)博客信息(内容)
  7. 利用GridView显示主细表并添加打开、关闭功能
  8. UVa 10491 - Cows and Cars(全概率)
  9. hdu 5823 color II 状压dp
  10. Codeforces Round #328 (Div. 2)D. Super M 虚树直径