吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1756|回复: 8
收起左侧

[学习记录] def函数再学习

[复制链接]
l2430478 发表于 2021-1-14 15:06
本帖最后由 l2430478 于 2021-1-14 19:00 编辑

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

在python中,我们使用关键字def定义函数,和excel雷同,我们在python中允许嵌套定义函数,即一个函数定义的内部再定义一个函数但是,内部定义函数,不仅要有定义,也要有调用(否则就白定义了~~)
举个最最简单的例子:
[Python] 纯文本查看 复制代码
def hello():
    print("Hello World!")

我们再输出hello()
[Python] 纯文本查看 复制代码
hello()

就会得到Hello World!

这就完成了最简单的 定义函数和调用函数。
下面来个相对复杂的函数
[Python] 纯文本查看 复制代码
# 如何定义一个函数
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()


快照15.jpg

我们分析下参数的形参
[Python] 纯文本查看 复制代码
函数参数: 实参 形参
形参:位置参数 默认参数 可变参数 关键字参数

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

# 位置参数:形参和实参必须保持一致
# 实参 向形参传递值,依靠参数位置来传递/依靠参数名称指明相应的形参传递值
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([1,2,3,4,5])   直接传入一列表,调用函数失败
nums = [1,2,3,4]
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帮我们将其封装成了一个元组类型
[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))


函数的作用域
[Python] 纯文本查看 复制代码
可以参考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数据类型
[Python] 纯文本查看 复制代码
>>> def abvedu_add(x,y):
        print( x + y)
>>> abvedu_add(3,6)
9
>>> 


2、没有形参的自定义函数:该形式是标准自定义函数的特例。
[Python] 纯文本查看 复制代码
>>> def abvedu_print():
        print("hello Python!")
>>> abvedu_print()
hello Python!
>>> 

3、使用默认值的自定义函数:

在定义函数指定参数时,有时候会有一些默认的值,可以利用“=”先指定在参数列表上,如果在调用的时候没有设置此参数,那么该参数就使用默认的值。

[Python] 纯文本查看 复制代码
>>> def abvedu_printSymbol(n,symbol = " %"):
        for i in range(1,n+1):
                print(symbol , end ="")
        print()
 
>>> abvedu_printSymbol(6)
 % % % % % %
>>> abvedu_printSymbol(9,"@")
@@@@@@@@@
>>> 


4、参数个数不确定的自定义函数:
此函数可以接受没有预先设置的参数个数,定义方法是在参数的前面加上“*”。
[Python] 纯文本查看 复制代码
>>> 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函数一起使用。
[Python] 纯文本查看 复制代码
>>> 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


免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
ylu + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
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
讲得简单明了,谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-2 08:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表