Python函数

  • Python有一些自带的函数需要进行使用和了解,一些前面了解过的函数比如inputprintformat等函数已经具体介绍过了,这里就不多介绍了

  • python的函数与其他语言的函数一样,你也可以把它看做带有名字的子程序

  • 格式:python函数使用def关键字定义,函数名可以是任何有效的python标识符

1
2
3
4
5
6
7
8
def <函数名>(<参数列表>):
<函数体>
return <返回值列表>

def f(a,b,c):
a = b+c+a;
c = a+b;
return a,c

参数传递

  • Python函数中的传递有三种
    • 指定参数传递:一开始设置传递几个参数,就传递几个参数。指定参数传递还可以按照名称传递
    • 默认参数传递:可以一开始设置一个默认参数值,使用函数时就可以不用传递设置默认参数值。
    • 可变参数传递:与其他语言类似,Python可以进行可变参数的传递
  • 指定参数传递:设置几个参数就传几个参数,也可按照参数名称传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f(a,b,c):
a = b*c
b = a*c
return a

m = 2
n = 3
h = f(m,n,4)
print(h)
# 12
# 按照参数名称传递,就可以不用按照a,b,c这样的顺序进行传递参数
# 可以这样进行参数的传递
h = f(c = 4,a = m, b = n)
print(h)
# 12
  • 默认参数传递:在定义函数的时候给一个默认值
1
2
3
4
5
6
7
8
9
def dup(str,times = 2):
print(str*times)
# 下面是使用默认参数传递
dup("knock~")
# knock~knock~

# 下面是指定参数传递
dup("knock~",4)
# knock~knock~knock~knock~
  • 可变参数传递,允许传递未知参数的个数
  • 输入的可变参数会当做元组这一数据类型进行处理
1
2
3
4
5
6
7
8
9
10
def vfunc(a,*b):
print(type(b))
for n in b:
a+=n
return a

h = vfunc(1,2,3,4)
print(h)
<class 'tuple'>
10

返回值

  • Python函数与其他函数一样都有返回值。但是Python的函数可以返回一个值,也可以返回多个值
  • 当返回值的个数与接收返回值的变量一致时,就会按照顺序将返回值逐个赋值给接受的变量
1
2
3
4
5
6
def vfunc(a,b,c,d):
return a

h = vfunc(1,2,3,4)
print(h)
# 1
  • 当一个变量接受多个返回值时,这些多个返回值就会按照返回顺序构成一个元组,然后再赋值给接受返回值的变量
1
2
3
4
5
6
def vfunc(a,b,c,d):
return a,b,c,d

h = vfunc(1,2,3,4)
print(h)
# (1, 2, 3, 4)
  • 当接受变量与返回值不一致的时候,就会出现报错
1
2
3
4
5
6
7
8
9
def vfunc(a,b,c,d):
return a,b,c,d

h ,i = vfunc(1,2,3,4)
print(h,i)

h ,i = vfunc(1,2,3,4)
^^^^
ValueError: too many values to unpack (expected 2)

函数里变量的作用域

  • 在函数中变量用作用的范围,具体的不多介绍。介绍作用域多排错有关系,不过目前是初步学习

eval函数

  • eval函数可以将传递的参数做为命令进行执行,并返回执行后的值

    • 由于eval函数会执行用户输入的命令,这就导致了一些安全问题
    • 当然eval函数危险的同时也带来了便捷,更方便了用户与程序之间的交互功能
  • 语法:

1
eval(expression[, globals[, locals]])
  • 例如:
1
2
3
4
5
6
7
8
9
a = 7
b = eval('3*a')
print(b)
# 21

a = 7
b = eval('pow(2,2)')
print(b)
# 4
  • 还可以使用eval函数实现自动化脚本,通过与其他程序的交互实现自动计算功能

  • 比如:有一个靶机,它会发送一个算式,要求我们在短时间内计算其结果。

image-20240904092517795

  • 这时就可以使用eval函数进行快速的计算,而且考虑较少的交互功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from pwn import *
context(log_level = 'debug')
p = remote("172.19.8.207",51924)
p.sendlineafter(b'1 + 1 = ',str(2))
p.sendlineafter(b'4 / 3 - 1 = ',str(0))
p.recvuntil(b'OK, then some tough ones. Be WELL PREPARED!')
while True:
a = p.recvuntil(b'=')
a = a.decode("utf-8")
b = ''
for i in a:
if i == '\n':
continue
if i == '=':
continue
if i == '/':
b += '//'
continue
b += i
print('b = ',b)
c = eval(b)
print(c)
p.send(str(int(c)).encode('utf-8'))
p.sendline(b'')
# moectf{ar1tHMETiC-IS_NOT_M@th3mATIcs1d259bb}

lambda函数

  • lambda函数:lambda可以有任意的参数,但是只有一个表达式。

  • 所以只用一行或者一句话表达出来的函数都可以使用lambda表达式写出来。

  • lambda函数也可以和def这个函数定义结合起来

  • 格式:

1
lambda x: 关于x的表达式
  • 示例1:
1
2
3
4
5
6
7
8
9
def f(x):
return x*x
# 这个函数可以修改为
f = lambda x: x*x

def f(x,y,z):
return x+y+z
# 这个函数可以修改为
f = lambda x,y,z: x + y + z
  • 示例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f(n):
retrun lambda a: n*a

h = f(3) # 即h = lambda a: 3*a
printf(h(11))
# 33
# 或者
def myfunc(n):
return lambda a : a * n

mydoubler = myfunc(2)
mytripler = myfunc(3)

print(mydoubler(11)) # 22
print(mytripler(11)) # 33