l2430478 发表于 2021-1-14 15:06

def函数再学习

本帖最后由 l2430478 于 2021-1-14 19:00 编辑

纵观上一个豆瓣电影爬虫,def函数是个关键,贯穿这整个代码,也是大家爬虫学习,或者说是python学习中迈不开的一个坎,今天,我们就来重新学习一下def函数。
和大家分享的同时,也是自我学习的一个过程,我到处搜集资料,对我自身也是一种提高。
-------------------------------
函数的定义:

在python中,我们使用关键字def定义函数,和excel雷同,我们在python中允许嵌套定义函数,即一个函数定义的内部再定义一个函数但是,内部定义函数,不仅要有定义,也要有调用(否则就白定义了~~)
举个最最简单的例子:
def hello():
    print("Hello World!")
我们再输出hello()
hello()
就会得到Hello World!
这就完成了最简单的 定义函数和调用函数。
下面来个相对复杂的函数
# 如何定义一个函数
def hello():
    print('python')
    print('hello')

# 通过函数名来调用函数
hello()执行后,会得到两行数据
python
hello

def westos():
    print('it is westos')
    def python():
      print('is python')
    python()    #若没有在westos函数的定义中调用python的话,则不会输出python函数
westos()

# 定义函数的时候使用的变量叫形参(名字任意)
# 形参实际就是一个占位符,等待实参传入具体的值
def welcome(a):
    print('welcome',a)
# 真实的数据信息,调用函数的时候传递进入函数内部值的变量(参数)叫函数的实参
welcome('tom')
welcome('lily')
# welcome()



我们分析下参数的形参
函数参数: 实参 形参
形参:位置参数 默认参数 可变参数 关键字参数

实际参数若没有对应的形式参数来接收(对应),会报错

# 位置参数:形参和实参必须保持一致
# 实参 向形参传递值,依靠参数位置来传递/依靠参数名称指明相应的形参传递值
def getinfo(name,age):
    print('姓名:',name,'年龄:',age)
# getinfo('westos',11)
# getinfo(11,'westos')
getinfo(age=11,name='westos')

# 默认参数
默认参数,对于原始的默认函数,进行二次封装
使得自己新定义的函数,即便少输入参数也可以正常执行。
默认参数:
当该形参未接收到数据时,以默认值执行函数。
当该参数接收到值时,以所接收到的实参的值来执行函数
def mypow(x,y=2):
    print(x ** y)
mypow(2,3)
mypow(2)

# 可变参数
输入*num 解包
def mysum(*a):      #*a 该形参接收一串整型或浮点型的值
    print(*a)
    print(a)
    sum= 0
    for item in a:
      sum += item
    print(sum)

# mysum(1,2,3,4,5)   传入一串整型序列,可以成功调用函数
# mysum()   直接传入一列表,调用函数失败
nums =
nums2 = (1,2,3,4)
nums3 = {1,2,3,4}
# 参数解包:在参数名前加*
# 却不能直接用列表,元组,集合作为实参,需要先解包(使用*符号)
mysum(*nums) # *nums:1 2 3 4
mysum(*nums2)
mysum(*nums3)

# 关键字参数
def getinfo(name,age,**k):
    print(name)
    print(age)
    print(k)
d = dict(a=1,b=2)
print(*d)
# getinfo('westos',12,**d)



函数的返回值
想让变量引用函数的结果,必须让函数将其结果作为返回值返回。
否则,函数执行完毕后,其内存地址被释放,其结果值无法被变量引用
与c不同的是,python可以有多个返回值同时返回。因为python帮我们将其封装成了一个元组类型返回值:函数运算的结果,还需要进一步操作,就给函数的执行结果一个返回值,将其值传出函数
return用来返回函数执行的结果,如果函数没有返回值,默认返回None
一旦遇到return 函数执行结束,后面的代码不会执行
多个返回值的时候,python会帮我们封装成一个元组类型

def mypow(x,y=2):
    #print(x ** y)
    # pass
    return x**y,x+y
a = mypow(2,4)
print(a)
print(mypow(5,2))


函数的作用域
可以参考c语言中变量的生命域/作用域

a = 1
print('outside:',id(a))

def fun():
    global a #声明a为全局变量   可以再将关键字global去掉
    a = 5
    print('inside:',id(a))

fun()
print(a)
print(id(a))

#id() 查看变量所引用的内存地址空间



------------------------------------------
执行体程序代码
Python自定义函数的5种常见形式:
1、标准自定义函数:形参列表是标准的tuple数据类型
>>> def abvedu_add(x,y):
      print( x + y)
>>> abvedu_add(3,6)
9
>>>

2、没有形参的自定义函数:该形式是标准自定义函数的特例。
>>> def abvedu_print():
      print("hello Python!")
>>> abvedu_print()
hello Python!
>>>
3、使用默认值的自定义函数:

在定义函数指定参数时,有时候会有一些默认的值,可以利用“=”先指定在参数列表上,如果在调用的时候没有设置此参数,那么该参数就使用默认的值。
>>> def abvedu_printSymbol(n,symbol = " %"):
      for i in range(1,n+1):
                print(symbol , end ="")
      print()

>>> abvedu_printSymbol(6)
% % % % % %
>>> abvedu_printSymbol(9,"@")
@@@@@@@@@
>>>

4、参数个数不确定的自定义函数:
此函数可以接受没有预先设置的参数个数,定义方法是在参数的前面加上“*”。
>>> def abvedu_main(*args):
      print("参数分别是:")
      for arg in args:
                print(arg)

               
>>> abvedu_main(1,2,3)
参数分别是:
1
2
3
>>> abvedu_main(6,9)
参数分别是:
6
9
>>> abvedu_main('a','b','v','e',"du")
参数分别是:
a
b
v
e
du
>>>

5、使用lambda隐函数的自定义函数:
Python提供了一种非常有趣、精简好用的一行自定义函数的方法lambda,这是一种可以实现一行语句、用完即丢的自定义函数。语法形式是:
lambda 参数列表:执行语句
其实,它对应的标准自定义函数形式:
def函数名称(参数列表):
return 语句内容
这种定义方式可以和map函数一起使用。
>>> x = range(1,9)
>>> x
range(1, 9)
>>> y = map(lambda i: i**3, x)
>>> for i, value in enumerate(y):
      print("{}^3 = {}".format(i,value))

      
0^3 = 1
1^3 = 8
2^3 = 27
3^3 = 64
4^3 = 125
5^3 = 216
6^3 = 343
7^3 = 512

diaozatian815 发表于 2021-1-14 15:16

luanshils 发表于 2021-1-14 15:30

我只知道*在C里面是取指针的值,但是python我就不知道传的什么类型的参数会需要取值

jayeewing 发表于 2021-1-14 15:36

学习了学习

aristan 发表于 2021-1-14 16:22

其实和C也没有太大的区别,语言都是相同的原因吧?python太优雅了。python可以爬虫是因为他的什么独特性?理论上语言都可以啊

diaozatian815 发表于 2021-1-14 16:37

52soft 发表于 2021-1-14 16:57

想说什么呢?

夜语声烦 发表于 2021-1-17 20:07

学习学习 了

wind315_ 发表于 2021-1-17 22:31

讲得简单明了,谢谢
页: [1]
查看完整版本: def函数再学习