一、定义一个函数
目前为止,我们已经不止一次的使用过已有的函数了,这个过程也叫做调用函数。调用函数的方式就是叫做它的名字;函数有特定的功能;函数有参数;函数可以有返回值。
def add(a,b)
result = a +b
return result
def 后面是函数的名字,有了名字的函数我们才能够反复的使用。给函数起名的规则实际上和给变量起名的规则是一致的。
括号里面是参数的名字,参数一般是为了明确函数可以处理什么样的数据,非预期的参数可能会引发报错。参数可以有多个,但是名字不能重复。
缩进的代码块是函数具体要做的事情,也就是我们说的写一个函数功能的地方。
return 后面代表函数返回的结果,一般来讲可以是函数内部进行运算之后的结果,但其实不一定要写 return ,这取决于你对函数功能的设计。同时要知道的是, return 在函数中还代表这【结束】,也就是一旦阅读到 return 这一行, 函数就算是执行完成了。尤其是当函数中出现了不同分支的条件判断,要格外注意这一点。
url = 'www.example.com'
def merge_url(url):
if not url.startswith('htttp://')
full_url = 'http://'+url
return full_url
else:
return url
new_url = merge_url(url)
print(new_url)
name_list = ['Jimmy Page','-Jim morrison']
def name_filter(name_list):
for name in name_list:
if name.startswith('-'):
print(name + ' is not avalible')
name_filter(name_list)
二、我们要写什么样的函数
1、创建可以使用的函数,一般有两种方式:第一种是,从底层上重新设计然后再进行组装(一般是使用C语言编写);第二种是,直接在已有的功能和基础上进行重新组装。
Python 中有许多实用的第三方库,像是 lxml(C底层)和 selenium(Java底层)属于第一种,通常这样做的目的是为了运行起来更有效率;像是 Request , Django 这样的库则是第二种,按照特定的目的组织已有的功能。我们要写的函数实际上是第二种,对已有的函数按照特定的使用目的进行整合。
2、对功能进行整合的函数
实际上也就是对重复的事情简单化,有的时候你会发现,在同一个项目中会反复的写到几行或者几十行相同的代码逻辑,在这种情况下我们就可以把想要做的事情整合起来,也就像是我们上面展示的那样的简单的函数做的事情一样。
def area(a, b, h):
result = 1/2 *(a + b)* h
return result
def test(word):
if word.startswitch('1')
print('first')
elif word.startswitch('2')
print('second')
else:
print('Nope')
3、对流程进行整合
即过程式编程风格的编程:按照我们所需的流程组织已有的功能,以步骤的方式呈现要做的事情。这其实就像是别人制造颜料,我们是用颜料来作画。
step_one()
step_two()
step_three()
我们按照要做的事情的流程,分为【主次】的结构进行安排,这种结构可以是多重包含的,可以是一个程序分了三个大的步骤实现,而每一步又分成若干小步骤来实现,以步骤的方式表现我们想让计算机做的事情。
组织这个过程的方式是有一定主观因素的,每个人都有不同的解决思路,它是计算上的客观事件发生的顺序与你对如何处理事情思考结果的结合的体现。按照这种【面向过程风格的编程】可以说是在少量代码情况下最划算的方式。我们一定程度上可以降低错误的概率,保证了可读性。
4、哪些函数可以整合进函数
(1)内置函数
简单的基础性函数,在 Python 中一共有 68 个。特征是你只需要记住名字写出来就能用。主要都是和类型转换以及基础语法相关的基础性函数,虽然它们非常重要,但是你不能指望着使用这些函数编写程序——因为他们就没办法做复杂的事情。
所有内置函数的名字和用法见 Python 文档:https://docs.python.org/3/library/functions.html
(2)标准库
这是 Python 这门语言提供给我们的高级功能的库,所谓的库就是类似于一个代码文件夹一样的存在。我们通过引用文件夹中文件里面的具体某一个函数或者是对象,从而使用库里面的函数。比如说像 sys 库就是和电脑操作系统打交道的一个库,Math 就是和数学、高级运算相关的一个库。
(3)第三方库
任何人都可以写一个第三方库给别人使用,就像写一个 App 给别人使用一样。标准库提供了基础性的功能的使用,而第三方库按照不同的使用目的,重新的整合组织了这些功能,同时也对实现特定的事情的易用性做出了改良,极大的提升了生产和开发效率。
5、引用库中的函数与对象
Python 自身和第三方有一些非常实用的库,但是我们引用之后才能使用。通过使用 import 和 from import 句式来导入到现在的代码文件中,其实也就是我要是用一个别人写好的库就一定要告诉 Python 解释器这个库的具体位置在哪里,如何找到这个库里面的函数和数据。同时要知道的是,实际上要引用的不仅仅是函数,另外一部分被引用的还有一些是事先写好的我们称之为类/对象的数据。
import a
from b import c
函数与方法的在引用上的区别在于,函数引用出来直接就能用,但是方法的话一般要先创造可以使用这个方法的对象——也就是实例化对象,现在还不是纠结什么是实例化的时候,我们完全可以不顾一切的先用起来,实例化看起来就像是这样子:
import A
a = A
a.method()
一个库就像是包含着若干文件的文件夹,我们引用一个或者是多个特定的函数,就像是一层一层的描述的就是我们要用的函数在文件夹中的位置。
from django import apps
print(apps.AppConfig)
print(apps.config)
print(apps.registry)
6、函数【房间】的秘密
(1)房子以内的数据我们看作是私有的【内部资源】,除了我们之外没有人可以来使用。
(2)房子以外的数据我们看作是【公共资源】,所有的人都可以使用。
(3)【内部资源】和【外部资源】的名字不冲突,也就意味着可以是同样的名字,但是对应的是不同的数据。
(4)【外部资源】可以拿来使用但是无法占为己有,也就是可以把外部的资源进行使用和加工,但是你无法改变原来的数据。
(5)如果外部数据是容器类型那么则例外,因为对容器内的元素进行添加和修改不算是把外部元素占为己有,我们称之为【更新】。
(6)return 返回的值可以看作是房价内和外部进行沟通桥梁。
三、确定解决问题的思维
在初步使用以面向过程风格的编程时,有一些需要注意的原则,可以帮助我们节省写代码的时间和降低非预期错误的出现。
1、在构想阶段,先考虑步骤,不考虑实现方式。因为你能想到的事情编程语言的库基本上都能帮你实现,没必要有【是不是有这样的一个功能】的担忧。
2、在实施阶段,逐个完善各个函数的具体实现。专注于易用性以及各个函数之间数据的传递,并且以适当的方式填补在上一个阶段没有考虑到的问题 。
3、在完善阶段,考虑易读性以及更巧妙的实现方式,也就是我们常说的漂亮的代码是改出来的。
四、真实解决问题的基本思路
将网站上的表格内容转换成 csv 内容
要爬取的网址是:http://bills.mugglecode.com/sample.html
要下载的代码模板和网页文件在这里:http://ozaz5wy8d.bkt.clouddn.com/starter.zip
第一步:得到网页并转化
第二步:提取文字
第三步:计划之外的步骤
第四步:导出表格
五、面向过程风格编程的注意事项
1、带有目的的思考。即便是有很强大的库来支持,程序也不像我们想象的那样【智能】,程序无法解决一个我们自身也想不明白的问题。
2、想要解决问题的基本手段就是分解问题,给问题划分不同的阶段特征,分别进行处理,这样保证了处理问题的有效性,同时也降低了复杂问题给思维上带来的难度。
3、除非你是经验丰富的编程者,否则你不可能在一开始的时候就想到【完全正解】的解决方案,在编程过程中调整步骤、进行修补,这很正常。
4、对于初学者要做的事情就是,有效的运用已知去解决未知的问题,在这个过程中不断的探索和学习新的理念。