五撩Python

重复,再重复,你就是专家。

--曾子

1、起手

来说函数。

2、函数

函数就是整理好的一堆可重用的代码,有输入,然后就有输出。

比如我们计算折扣,输入是消费者的购买信息,输出是折扣值。

函数的语法是这样的。

def functionname( parameters ):

do something

ruturn result

几个细节:

def,说明是定义函数;

parameters,是输入值,可以很多,也可以没有;

有冒号;

do something,是一个语句块;

return,就是返回结果了,也可以没有结果,表示函数就是做一些事而已;

函数以缩进为整体。

举个栗子,两个数相加(也可以不是数):

够简单,可以更简单

或者像下面这样的函数:

看到没,return后面是空的。这时候,return是结束函数。如果return是函数最后一句,也可以不要。因为到函数最后,自然会退出。

那函数如何用呢。像这样:

add(2, 3)叫函数调用,参数是2,3。add函数得到参数2,3以后,执行函数体,然后返回结果,并将值赋给变量res,一气呵成。

下面这种更风骚一点的调用:

这句话相当于分两步走,

第一种写法更简洁。

等等,字符串怎么能相加?是的,字符串在Python里是可以相加的,就是把它们连在一起,你试试看呀。

3、封装计算折扣

函数是一种代码封装,函数作为一个整体,不仅是代码整体,还是一个逻辑整体。函数可以看作是一个黑匣子,给输入,就有输出。

很多库是以函数的形式提供的。比如数学里面的sin,cos,random等,如恒河沙数数不清。

本咖灰师把计算折扣的代码也封装成函数了,以后有客来的时候,把相关信息作为参数,就可以得到折扣值了。好方便。如下:

有个注意点,第30行,这里有个return,就是程序如果运行到这里,就不需要再继续了,直接返回结果。函数可以有多个return。

4、变量的作用域

有个问题,如果把vip0~vip2,holiday_discount移到函数里面行不行。

从代码上来说,行的,也是不行的。(来呀,拖出去!)

慢慢说,变量是有作用域的,就是在这个代码范围内才能用,超出这个范围就不能用了。比如函数里定义的变量,只能在函数里面用,在函数外面就不能用了,解释器会报错。

而且,局部变量,超出它的作用域就会被释放掉。下次进入此函数的时候,这些变量统统重新定义

函数外面的变量,比如上面的vip0等,这叫全局变量,就是在这个代码文件中全部地方都可以访问。

在函数定义之前的全局变量,在函数里也可以用,但是,但是,如果你想在函数里修改全局变量的值一定要小心,比如本咖灰师修改了节假日折扣,如下:

虽然编辑器对第5行代码提出了一些异议,信心满满的我选择忽视,然后运行了代码,得到的结果还是0.9,本咖灰师明明把折扣设成0.8了呀。

事情是这样的,在函数里,第5行的那句话实际上是新定义了一个函数里的局部变量并赋值,而不是改了全局的那个holiday_discount的值。虽然大家名字是一样的,但是各自领地是不一样的,到函数内部,就得听地头蛇的。而函数外输出的那个是全局变量。

那函数里如何修改全局变量呢,要像这样:

看看,这下编辑器表示情绪很稳定。

注意第5行,加了一句global holiday_discount,这句话是告诉Python,哥下面用到的变量holiday_discount是全局变量。再次运行代码,折扣已经是0.8了。动心了吗?2018的第一场雪,折扣比以往来得更猛烈一些。

回到本节开头。把本代码的几个全局变量移到函数里行不行呢。

如果调用这个函数一次,是没问题的。

潜在的问题是,比如vip0,是函数局部变量,如果新客来,按照代码,会将新客的名字加入vip0中,下次再来的时候,就没有第一杯免费了。

但是,vip0是局部变量,函数再次调用的时候,又是一个全新的vip0,已不是上次的vip0,上次加入的新客人信息统统没了。效果就是永远免费。本咖啡师是决不能容忍这种事情滴!

另外,从逻辑上来,这些全局变量,还是作为全局变量比较好。呃,您自个体会吧。

后记

整个撩Python系列,是凌乱的,咖啡师嘛,总是感性一些。理解就好。来呀

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端架构

闲话闭包

如果让谷哥找一下“闭包”这个词,会发现网上关于闭包的文章已经不计其数 维基百科上对闭包的解释就很经典:

821
来自专栏编程

关于python字典类型最疯狂的表达方式

[译]关于python字典类型最疯狂的表达方式 一个Python字典表达式谜题 这个子字典是从哪里来的 Umm..好吧,可以得到什么结论呢? 一篇来自 Dan ...

18410
来自专栏工科狗和生物喵

【计算机本科补全计划】Java学习笔记(五) 运算符

正文之前 本文属于流水账,因为早就在C++里面学过了。Java基本是继承了C++的那些,所以贴个代码应该就OK了?,当然,有点特有的运算符我还是得解释下的。毕竟...

3325
来自专栏AzMark

Python列表与元组

803
来自专栏Golang语言社区

第五节:Go语言常量

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

892
来自专栏Golang语言社区

第五节:Go语言常量

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

712
来自专栏静晴轩

JavaScript 字符串实用常操纪要

JavaScript 字符串用于存储和处理文本。因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作...

3577
来自专栏java一日一条

使用 Java 8 Optional 的正确姿势

我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPoi...

321
来自专栏编程

程序员C语言C加加新手小白入门基础最容易犯的17种错误,你中了几个?

相信这么努力的你 已经置顶了我 C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考...

1715
来自专栏云飞学编程

Python学习,这些高阶函数和高阶特性值得一学

Python语言这么火,不论是对于刚开始学习的编程小白或者有接触过其他语言(c/c++/java等等)的同学来说,写代码的时候难免会受本身惯性思维或者其他语言的...

633

扫码关注云+社区