今天想把上次参考着网上教程写的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. IP地址的正则表达式

    关键字:IP地址 正则表达式作者:txw1958出处:http://www.cnblogs.com/txw1958/archive/2011/10/13/ip_address_regular_expr ...

  2. git 命令修改commit时的用户名和邮箱地址

    1.介绍 在git的用户名和邮箱是有一个仓库和全局之分的,在利用vs插件是也有显示:

  3. JAVA面试题解惑系列(七)——使用日期和时间

    日期和时间,不仅在考试面试题.处理的问题.似乎没有哪个项目能够避开它们.我们经常在处理用户的出生年月日.注冊日期,订单的创建时间等属性时用到,由此可见其重要性.  java.util.Date类  提 ...

  4. windows IIS发布.net core网站的环境配置

    1.安装对应的.net core的runtime2.安装Windows Server Hosting下载地址:https://www.microsoft.com/net/download/core#/ ...

  5. SICP 关于递归迭代的重新理解以及尾递归的引入...

    看了线性的递归和迭代以及树形递归迭代这部分的内容,感觉对递归和迭代又有了新的理解...所以记录一下,也算对这部分内容的总结吧. 首先书中提到的递归与迭代和我以前想的有点不一样,我感觉书中提到的递归和迭 ...

  6. 在 __CC_ARM 编译器环境下,使用$Sub$$ 与 $Super$$ 的“补丁”功能

    $Sub$$ 与 $Super$$ 的“补丁”功能(详见 ARM® Compiler v5.06 for µVision® armlink User Guide): 这是一种特殊模式:用于有一个已经存 ...

  7. 两种加载dll的方式

    通过链接lib文件加载dll的话,使用过程中没法动态切换 通过loadlibrary函数动态加载的话,可以动态切换

  8. Android零基础入门第80节:Intent 属性详解(下)

    上一期学习了Intent的前三个属性,本期接着学习其余四个属性,以及Android系统常用内置组件的启动. 四.Data和Type属性 Data属性通常用于向Action属性提供操作的数据.Data属 ...

  9. Capsule Network

    Capsule Network最大的特色在于vector in vector out & 动态路由算法. vector in vector out 所谓vector in vector out ...

  10. 【Qt】无边框窗体中带有ActiveX组件时的一个BUG

    无意中发现的一个BUG,Qt5.1.1正式版首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)接着 ...