今天想把上次参考着网上教程写的scrapy爬虫改写成requests和beautifulsoup的普通爬虫,写着写着发现自己对python的自定义函数还不是太熟悉(自己TCL了。。。。。。。。。流泪),赶紧菜鸟教程上复习一下,顺便写篇文章。

0x01:关键字

python中,自定义函数使用def关键字,后面加函数名和参数列表,如下:

def 函数名(参数列表):
函数体

如果不需要传参,括号里就不用填,注意,python中不需要定义变量类型。自定义函数除了函数的功能是我们自己编写代码实现的外,其他的与python中的函数并无差别,所以在调用函数时,直接使用函数名就行。眼见为实,来看下面的栗子。

def hello():

    print("hello world!!")

hello()

#输出如下
hello world!!

现在我们就自定义了一个简单的函数,他的功能是输出“hello world!!”,值得注意的是,python中并没用大括号({})划分代码块,python中靠的是相同的缩进,所以在写python时一定要注意一块代码中的缩进

0x02:自定义函数中的变量

在自定义函数时,我们难免会使用到变量,这就关系到了python的局部变量和全局变量,做一个简单的解释,局部变量就是在函数内部定义的变量,全局变量就是在函数内部定义的变量。在函数内部可以访问外面的全局变量,但不可以对全局变量进行修改,但在函数外部,不可以访问局部变量。

>>> a=3
>>> def test():
... print(a) #函数内访问全局变量
...
>>> test()
3
>>> def test4():
... a=a+1
... print(a) #函数内修改全局变量会报错
...
>>> test4()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in test4
UnboundLocalError: local variable 'a' referenced before assignment
>>>
>>> def test3():
... c=5
...
>>> c #外部访问局部变量也会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined

其实无论是在外部访问局部变量还是在函数内修改全局变量都是有方法的,大家可以百度一下。

0x03:带参数的自定义函数

>>> def test5(m,n):
... print(m*n)
...
>>> test5(2,3)
6
>>>

我们定义了一个带参数的函数,他的功能是计算m*n的值,如果传入的值无法进行运算,则会报错

0x04:参数的传递

python参数的传递分为四种情况:必须参数、关键字参数、默认参数、不定长参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,上面的test5()函数的两个参数就是必须参数,如果我们只传入一个值,就会报错。如下:

>>> test5(8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: test5() missing 1 required positional argument: 'n'
>>>

关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

>>> def test6(name,age):
... print(name)
... print(age)
...
>>> test6(age=50,name="liang")
liang
50
>>>

参数的顺序是name、age,虽然我们先传入了age,但因为在传入时带上了关键字,所以也不会报错。

默认参数调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:

>>> def test7(name,age=50):
... print(name)
... print(age)
...
>>> test7('liang')
liang
50
>>> test7('liang',100)
liang
100
>>>

第一次调用时只传入了name参数,所以age参数使用了默认值,第二只调用时对age参数也传入了值,所以胡覆盖掉默认的50.

值得注意的是:在默认使用参数,第一个默认参数后的所有参数都要是默认参数,就是说,如果你把第二个参数设为默认,那么后面的第三第四...个参数都要是默认的,要不会出现“non-default argument follows default argument”错误.

不定长参数存放所有未命名的变量参数。比如你在函数中值定义了两个参数,而在调用时你需要传入四个或者更多,那么从第三个开始的参数都会被存放到不定长参数中。

>>> def test8(n,*var):
... print(n)
... print(var)
...
>>> test8(1,2,3,4,5,6)
1
(2, 3, 4, 5, 6)
>>>

第一个参数被传递给n,后面都以元祖的形式存放在var这个不定长参数中。

(ps:本人太菜,若有错误的地方欢迎大佬随时责骂。。。。xixixii)

python的自定义函数的更多相关文章

  1. Python学习教程(learning Python)--2.1 Python下自定义函数

    在Python里可以自定义函数,实现某特定功能,这里首先要区分一下函数的定义和函数的调用两个基本概念,初学者往往容易混淆. 函数的定义是指将一堆能实现特定功能的语句用一个函数名标识起来,而函数的调用则 ...

  2. python基础:自定义函数

    一.背景 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下 ...

  3. Python应用——自定义函数:分割PDF文件函数

    案例 将一个 pdf 文件按要求分割为几个部分.比如说一个pdf有20页,分成5个pdf文件,每个pdf文件包含4页.设计函数实现? Python代码 from PyPDF2 import PdfFi ...

  4. Python之自定义函数

    函数 1.定义函数 在Python中定义一个函数要使用def语句,一次写出函数名.括号.括号中的的参数和冒号,然后在缩进块中编写函数体,函数的返回值用return返回.如下所示: def 函数名(参数 ...

  5. 初识python: 自定义函数

    什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 函数的定义方法: def test(x): '函数定义方法' x+=1 r ...

  6. 【python】自定义函数def funName():

  7. python学习之--自定义函数:

    Python之--自定义函数: 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 以下自定义 ...

  8. 17.python自定义函数

    什么是函数,函数说白了就是将一系列代码封装起来,实现代码的重用. 什么是代码重用? 假设我有这样的需求: 但是我还是觉得太麻烦了,每次想吃饭的时候都要重复这样的步骤.此时,我希望有这样的机器:

  9. Python学习教程(learning Python)--2.3 Python自定义函数传参函数设计

    Python里自定义子函数时,可以在调用时携带一些参数到子函数里去处理.具体用法结构如下: def func(arguments): statement statement etc. 定义子函数一定要 ...

随机推荐

  1. VCL to UniGUI Migration Wizard

    Free Evaluation Edition of The Automatic Migration Scripting Wizard For Converting Legacy Delphi Cod ...

  2. 第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人

    8月9日,晴. "江城如画里,山晓望晴空. 雨水夹明镜.双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机载入子弹和音效及背景音乐,本篇主要加入敌机. 本篇要用到的几个函数解 ...

  3. Hadoop MapReduce编程入门案例

    Hadoop入门例程简介 一个.有些指令 (1)Hadoop新与旧API差异 新API倾向于使用虚拟课堂(象类),而不是接口.由于这更easy扩展. 比如,能够无需改动类的实现而在虚类中加入一个方法( ...

  4. html 自制属性

    HTML5 允许扩展的(自制的)属性,以 data- 开头 <label id="id0" data-value="0">0</label&g ...

  5. 检查Android是否支持指纹识别以及是否已经录入指纹

    原文:检查Android是否支持指纹识别以及是否已经录入指纹 Android M 开始,系统中加入了指纹相关功能. 主要用到的类为:FingerprintManager 只提供三个方法: 返回值 方法 ...

  6. Mysql数据库表的自增主键ID号乱了,需要重新排列。

    Mysql数据库表的自增主键ID号乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键:ALTER TABLE `table_name` DROP `id`; 2, ...

  7. mysql索引创建&查看&删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  8. 一个Demo让你掌握Android所有控件

    原文:一个Demo让你掌握Android所有控件 本文是转载收藏,侵删,出处:"安卓巴士"      下面给出实现各个组件的源代码: 1.下拉框实现--Spinner packag ...

  9. delphi7 stringgrid 点列头排序

    最近在做stringgrid的项目, 下面delphi7 正常使用,均摘抄网路,但做过细微调整才能正常使用 首先排序的过程 procedure Quicksort(Grid: TStringGrid; ...

  10. QT5 屏幕旋转90度

    主要思路是将所有项目界面加载到QGraphicsScene,再进行旋转操作.直接上代码#include <QApplication>#include <QGraphicsView&g ...