今天想把上次参考着网上教程写的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)