发表在 小白学python 07-30 15:52:45
通过观察规律其实不难发现,Python 中所谓的使用函数,就是把你要处理的对象放到一个名字后面的括号里。简单来说,函数就是这么使用的,往里面塞东西就可以得到处理结果。这样的函数在 Python 中还有这些:
以最新的3.50版本为例,一共存在68个这样的函数,它们被统称为内建函数(Built-in Functions)。之所以被称为内建函数,并不是因为还有“外建函数”这个概念,内建的意思是在3.50版本安装完成后,你就可以使用这些函数,是“自带”的而已。千万不要被这些术语搞晕了头,往后学习我们还能看见更多这样的术语,因为在一个专业领域内,为了表达准确和高效,往往会使用专业术语来表达,其实都是很简单的概念。
不必急着把这些函数是怎么用的都搞明白,其中一些内建函数很实用,但是另外一些就不常用,比如涉及字符编码的函数 ascii(),bin(),chr()等等,这些都是相对底层的编程设计中才会使用到的函数,在你深入到一定程度的时候才会派上用场。
附上 Python 官网中各个函数的介绍,有兴趣深入了解的话可以看一眼。
我们需要学会使用已有的函数,更需要学会创建新的函数。自带的函数数量是有限的,想要让 Python 帮助我们做更多的事情,就要自己设计符合使用需求的函数。创建函数也很简单,其实我们在多年前的初中课堂上早已掌握了其原理。
先试着在命令行/终端中进入 Python 环境,输入这样的公式:
看着有点眼熟吧?第一个是数学的梯形计算公式,第二个是物理的摄氏度与华氏度的转换公式。
函数是编程中最基本的魔法,但同时一切的复杂又都隐含其中。它的原理和我们学习的数学公式相似,但是并不完全一样,等到后面你就知道为什么这么说了,这里面先介绍几个常见的词:
需要注意的是:
现在我们看一下之前提到的摄氏度转化公式,按照上面定义函数的方法来实现一遍。我们把摄氏度转化定义为函数fahrenheit_Converter() ,那么将输入进去的必然是摄氏度(Celsius)的数值,我们把 C 设为参数,最后返回的是华氏度(fahrenheit)的数值,我们用下面的函数来表达,输入代码:
def fahrenheit_converter(C):
fahrenheit = C * 9/5 + 32
return str(fahrenheit) + '˚F'输入完以上代码后,函数定义完成,那么我们开始使用它。我们把使用函数这种行为叫做“调用”(call),你可以简单地理解成你请求 Python 帮你去做一件事情,就像是我们之前学习到的函数 len()一样:“请帮我测量这个(对象)的长度,并将结果打印出来。”
lyric_length = len('I Cry Out For Magic!')
print(lyric_length)C2F = fahrenheit_converter(35)
print(C2F)好,到了这里函数的定义和基本用法你就已经了解,在很长一段时间内你知道上面所讲的这些内容就基本够用了,但为了让你在深入使用函数的时候不产生困惑和挣扎,接下来我们试着解决一个更复杂的问题。
我们把刚才的函数按照如下进行修改:
def fahrenheit_converter(C):
fahrenheit = C * 9/5 + 32
print(str(fahrenheit) + '˚F')C2F = fahrenheit_converter(35)
print(C2F)95.0˚F
None其实,得到这样的结果是因为 print 是一个函数,并非关键字(如果你的print不是函数那说明你的版本还停留在2.x系列,现在就赶紧安装3.0以上的版本!)。如果你足够细心的话可以发现,在 IDE 中,虽说 print 与 return 它们都是蓝色,但实际是有区分的:一个是正常体,一个是斜体。return 作为关键字在函数中起到了返回值的作用,而 print 顾名思义,只是在函数中展示给我们打印的结果,是为人类设计的函数。因此上面的 95.0ºF 实际上是调用函数后产生的数值,而下面的 None 正是此时变量 C2F 中所被返回到的数值——什么都没有,就因为没有关键字 return 。这就好比你对着一个人喊了一声他的名字(call),他只是“哎”地回应你一声,这是因为你并没有告诉他该做什么(return)。
没有 return 也没关系,不代表没有用,在 Python 中 return 是可选的(optional),这意味着你可以不用写 return 也可以顺利地定义一个函数并使用,只不过返回值是 ‘None’ 罢了。在后面我们还能见到不同使用方式的函数,这里只需要记住函数的基本设定即可。
在前面我们提到过,定义一个函数是使用 def(define),同时我们还能在各种教材不同版本的翻译中看到声明(declare)这个词,我们不难推测,从表达的目的上来说他们是一样的,但对于有其他语言基础的人来说,这两个词意味着两种不同的行为。其实没关系,在 Python 中 definition 和 declaration 是一体的,在这里说明仅仅是为了解答此困惑,深究则无意。
前面大刀阔斧地说了关于函数定义和使用,在这一节我们谈论一些细节但是重要的问题一一参数。对于在一开始就设定了必要参数的函数来说,我们是通过打出函数的名称并向括号中传递参数实现对函数的调用(call),即只要把参数放进函数的括号中即可,就像是这样:
fahrenheit_converter(35)
fahrenheit_converter(15)
fahrenheit_converter(0)
fahrenheit_converter(-3)现在从似乎被我们遗忘的梯形的数学公式开始入手,首先还是创建函数。
我们把函数的名称定为 trapezoid_area,也就是梯形面积,设定参数为 base_up(上底),base_down(下底),height(高),每一个都用英文输入法的逗号隔开。梯形的面积需要知道这三个值才能求得,因此对于构造梯形面积的函数来说,这三个参数缺一不可。
def trapezoid_area(base_up, base_down, height):
return 1/2 * (base_up + base_down) * heighttrapezoid_area(1,2,3)接着是第二种传入方式:
trapezoid_area(base_up=1, base_down=2, height=3)想一想去餐厅预约与就餐的流程:找到你预约的座位一般是用你留下的姓名,你就是一个参数,你会被按照姓名的方式传入你预定的座位,这个就是关键词参数传入;接下来是上菜,菜品按照你的座位号的方式来传入你的桌子,而这就相当于是位置传入参数。
也许你现在想不太明白这种传入方式有何作用,没有关系,后面我们会和其他知识一并进行讲解,到那时你就会对参数的传入方式有更高层次的认识。
避免混乱的最好方法就是先制造混乱,我们试着解决一个更复杂的问题,按照下面几种方式调用函数并打印结果:
trapezoid_area(height=3, base_down=2, base_up=1) # RIGHT!
trapezoid_area(height=3, base_down=2, 1) # WRONG!
trapezoid_area(base_up=1, base_down=2, 3) # RIGHT!
trapezoid_area(1, 2, height=3) # RIGHT!注:正确运行的结果应该是4.5,也就是这个梯形的面积。
我们现在给一组变量赋值,然后再调用函数:
base_up = 1
base_down = 2
height = 3
trapezoid_area(height, base_down, base_up)如果你有这样的困惑,说明你已经被参数的命名和变量的命名搞晕,我们来把这两者区分清晰。首先,我们在定义函数的时候会定义参数的名称,其作用是使用函数时指导我们传入什么参数,它们从哪里来,是什么类型等,提供与使用函数相关的上下文。下面这段代码也许能够帮助你摆脱函数来自参数名称的困扰:
def flashlight (battery1, battery2):
return 'Light!'nanfu1 = 600
nanfu2 = 600
flashlight(nanfu1, nanfu2)看明白了吗?南孚是电池的一种,是可以让手电筒发光的东西,将南孚电池放入就意味着我们放入了手电筒所需的电池,换句话说,nanfu1,nanfu2 是变量,同时也是满足能够传入的函数的 flashlight 函数的参数,传入后就代替了原有的 battery1 和battery2 且传入方式仍旧是位置参数传入。battery1 和 battery2 只是形式上的的占位符,表达的意思是函数所需的参数应该是和电池即 battery 有关的变量或者是对象。
你看到的这个魔法就是我们将要提到的神奇的默认参数。默认参数是可选的,这意味着即使你上来不给它传入什么东西,函数还是可以正常运作。
你只需要这样输入代码:
def trapezoid_area(base_up, base_down, height=3):
return 1/2 * (base_up + base_down) * heighttrapezoid_area(1, 2)trapezoid_area(1, 2, height=15)默认值并非是你掌握参数使用的必要知识,却是能帮助我们节省时间的小技巧。在实际项目中也经常会看见这样:
requests.get(url, headers=header)img.save(img_new, img_format, quality=100)到了这里,我们应该可以十分有自信地设计一个符合自己项目需求的函数了,我们将上面各种所有知识进行整合,来设计一个简易的敏感词过滤器,不过在这之前,先来认识一个新的函数一一open。
这个函数使用起来很简单,只需要传入两个参数就可以正常运转了:文件的完整路径和名称,打开的方式。
先在桌面上创建一个名为 text.txt 的文件。Windows 用户在桌面点击右键唤出菜单创建即可,Mac 用户则打开 Pages 创建文件后点击导出格式选择 txt 格式即可。现在我们使用 open 函数打开它:
open('/Users/Hou/Desktop/text.txt')open('C://Users/Hou/Desktop/')file = open('/Users/Hou/Desktop/text.txt','w')
file.write('Hello World')掌握了 open 与 write 的基本用法之后,我们就可以开始着手设计函数了,需求是这样的:传入参数 name 与 msg 就可以在桌面写入文件名称和内容的函数text_create,并且如果当桌面上没有这个可以写入的文件时,就要创建一个之后再写入。现在我们开搞吧!
def text_create(name, msg):
desktop_path = '/Users/Hou/Desktop/'
full_path = desktop_path + name + '.txt'
file = open(full_path,'w')
file.write(msg)
file.close()
print('Done')
text_create('hello','hello world') # 调用函数这样一来敏感词过滤器的第一部分我们就完成了。顺带一提,这个函数就是我们在前面提及到的并不需要 return 也能发挥作用的函数,最后的 print 仅仅是为了表明上面的所有语句均已执行,一个提示而已。接下来我们实现第二部分,敏感词过滤,需求是这样的:定义一个为函数 text_filter 的函数,传入参数 word,cencored_word 和 changed_word实现过滤,敏感词 cencored_word默认为‘lame’,替换词 changed_word 默认为‘Awesome’。现在继续:
def text_filter(word,censored_word = 'lame',changed_word = 'Awesome'):
return word.replace(censored_word, changed_word)
text_filter('Python is lame!') # 调用函数现在我们试着解决一个更复杂的问题,把两个函数进行合并:创建一个名为 text_censored_create 的函数,功能是在桌面上创建一个文本,可以在其中输入文字, 但是如果信息中含有敏感词的话将会被默认过滤后写入文件。其中文本的文件名参数为 name,信息参数为 msg,你可以先试着自己写一下,写完了再对照看下:
def censored_text_create(name, msg):
clean_msg = text_filter(msg)
text_create(name,clean_msg)
censored_text_create('Try','lame!lame!lame!') # 调用函数完成之后,你就会得到一个文本过滤器了!
本章只是借助数学阐明了函数的运作方式而已,但是如果你确实需要解决许多数学上的问题,可以参考以下表格,至于怎么用,多尝试就知道了。一定要敢于尝试,反正电脑也不会因为你的一行代码爆炸。
假设 a=10, b=20,则运算示例如下: