介绍自己做衣服的网站网站推广计划书范文
目录
1.函数相关术语
2.函数类型分类
3.栈
4.位置参数和关键字参数
5.默认参数
6.局部变量和全局变量
7.返回多个值
8.怀孕函数
9.匿名函数
10.可传递任意个数实参的函数
11.函数地址与函数接口
12.内置函数修改与函数包装
1.函数相关术语
函数的基本概念有函数头,函数名,形参和实参,函数体,如下图所示
- 参数是可选的,也就是说函数可以不包含参数,比如 def main():
- 使用 return result 返回语句来返回一个值,函数为带返回值的函数。
- 不使用 return 语句,函数为不带返回值的函数。不用 return 的函数,python 默认函数末尾加上了一个 return None,就是说返回了一个 None,空值。
2.函数类型分类
带参数,有返回值的函数
def myfunc(a, b):result = 0for i in range(a, b + 1):result += ireturn result
不带参数,无返回值的函数
def main():print("月满则亏")print("水满则溢")print("花满则衰")print("爱满则痴")main() # 执行 main()
带参数,无返回值的函数
def nprint(n):for i in range(n):print("xxxxxx")print(nprint(2))
3.栈
栈是在函数调用时产生的一个内存区域,用来存储函数的参数和局部变量的激活记录。
当调用一个函数时,这个函数的参数和局部变量的激活记录被压入栈。
当这个函数执行完毕,这些激活记录将会被从栈中删除。
示例代码
def func(Data1, Data2):Data3 = Data1 * Data2return Data3ret = func(1, 2)
对于语句ret = func(1, 2),func在调用时会产生一个栈,实参传递给形参,以及函数体内部的变量激活记录都会逐步记录在栈中(称为"压入栈"),函数调用完毕,这些记录会逐步从栈中清除出去("出栈")。
栈的特点:"后进先出"。就是最后进来的激活记录先被弹出堆栈。
4.位置参数和关键字参数
调用函数时,实参的值传递给形参,这个过程叫做值传递。值传递有多种方式,比如按默认位置,或者使用关键字参数。比如下面这个例子中f函数有3个关键字参数:x,y,z。
def f(x, y, z):return (x + y) / z# 使用位置参数调用函数
print(f(1, 2, 3)) # 1.0# 使用关键字参数调用函数
print(f(z=2, y=3, x=5)) # 4.0# 同时使用位置参数和关键字参数
print(f(7, z=3, y=2)) # 3.0
注意:调用函数时,位置参数在左边,关键字参数在右边。
5.默认参数
函数定义时, 形参如果带有关键字,表示当实参不赋值时,该变量具有默认值。
而当实参有赋值时,使用实参的赋值,而不是用默认值。
# 非默认值参数必须在默认值参数之前
def f(x, y=1, z=2):return x + y + zprint(f(1, 1, 1)) # 3
print(f(y=1, x=2, z=3)) # 6
print(f(1, z=3)) # 5
6.局部变量和全局变量
在函数内部定义的变量被称为局部变量。
在函数之外创建的变量被称为全局变量。
使用 global variable 语句将局部变量变为全局变量。
示例代码
x = 1
y = 1
z = 1def f(x):global yx = 2y = 2z = 2f(100)
print(x) # 1
print(y) # 2
print(z) # 1
在以上代码中:
- 一开始定义了x和y,它们是全局变量。
- 然后定义了一个函数f,形参有x,注意这里的x为函数的形参名,跟前面那个全局变量x不是同一个
- 函数体内部先使用了global y语句,它的作用是函数内部等会如果有y的调用,则y调用的是全局变量那个y。
- x = 2语句是一个赋值语句,注意这条赋值语句的x不是全局变量那个x,是形参变量x,因此全局变量那个x的值不会发生改变,仍为1
- y = 2语句:由于global y的作用,这里的y是全局变量的那个y,因此全局变量y的值会变成2
- z = 2语句:由于没有global z语句,这里的z是函数内部产生的局部变量,因此这里的赋值语句不会对全局变量那个z造成影响。
7.返回多个值
python 函数允许返回多个值。
函数多个数本质上是以元组的形式在传递值。
def sort(n1, n2):if n1 < n2:return n1, n2return n2, n1print(sort(2, 3)) # (2, 3)
a, b = sort(3, 2)print(a) # 2
print(b) # 3def func(num1, num2):return num1 + num2, num1 - num2x = func(2, 3)
print(type(x)) # <class 'tuple'>
8.怀孕函数
怀孕函数就是函数内部又定义了一个函数。
python 函数很特殊,可以无限嵌套。
def Test():def TestX():print("hello world")for i in range(3):TestX()Test()
9.匿名函数
匿名函数就是函数的简洁表达,使用关键字 lambda 实现。
# 例子1
myfunc = lambda a, b: a + b
print(myfunc(2, 3)) # 5# 例子2(用来装逼)
ret = (lambda a, b: a * b)(4, 5)
print(ret) # 20
(lambda data: print(data))("hello world") # hello world
10.可传递任意个数实参的函数
在Python中,可以创建一个函数,它可以接收任意数量的实参。这通过使用星号表达式()实现。星号运算符有两种形式:单星号(*)和双星号(**)。
①单星号(*):将实参列表转换为元组。
def mysum(*data):print(type(data)) # <class 'tuple'>ret = 0for x in data:ret += xreturn retprint(mysum(1, 2)) # 3
print(mysum(1, 2, 5, 7)) # 15
②双星号(**):将字典转换为关键字参数。
def mysum(**data):print(type(data)) # <class 'dict'>ret = 0for key in data:ret += data[key]print(key, data[key])return retprint(mysum(a=2, b=2, c=5, d=7)) # 这里用等号,等号左边为关键字,右边为值print(mysum(x=2, y=3)) # 这里用等号,等号左边为关键字,右边为值
③同时使用单星号(*)和双星号(**):函数可以接收任意数量的实参,并且可以是以上两种类型。
def print_args_kwargs(*args, **kwargs):print(args)print(kwargs)print_args_kwargs(1, 2, 3, a=1, b=2, c=3)
# 输出: (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
11.函数地址与函数接口
函数的本质是一个地址,可函数名赋值来实现相同功能
def myadd(num1, num2):return num1 + num2print(id(myadd)) # 2363817237224
print(type(myadd)) # <class 'function'>go = myadd # 注意软件规范不允许这样赋值,不然容易出问题
print(id(go), id(myadd)) # id 会相同
print(type(go), type(myadd)) # 类型都是函数ret = go(1, 2)
print(ret) # 3
函数名赋值实现函数的调用和定义的分离,实现函数接口,搭建框架。
# 函数的定义
def add(x, y):return x + y - 1# 函数的定义
def minus(x, y):return x - y + 10# 函数调用框架
def work(func_name, num1, num2):value = func_name(num1, num2)print(value)for i in range(value):print("hello world")return value + 1# 函数调用
work(add, 1, 2)# 函数调用
work(minus, 3, 4)
运行结果
2
hello world
hello world
9
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
12.内置函数修改与函数包装
修改内置函数
import osdef myprint(mystr):os.system("echo ---------------")if mystr.find("python is handsome.") != -1:os.system("echo " + mystr)else:os.system("echo " + "python is handsome!")os.system("echo " + mystr)print = myprint # 切换函数的地址
print("hello world")
print("Full love leads to madness")
运行结果
---------------
python is handsome!
hello world
---------------
python is handsome!
Full love leads to madness
函数包装:
- 加密 or 保护费
- 还可以给函数的使用加密
- 每次调用都要输入密码才行
示例代码
import os# 备份原来的函数地址
backossystem = os.system# 等价的调用
# backossystem("notepad")# 需要收费的系统
def system_check(mystr):if mystr.find("A") != -1:backossystem(mystr)else:print("请开通会员否则 " + mystr + " 无法执行")# 修改内置函数地址
os.system = system_check
os.system("echo hello world")
运行结果
请开通会员否则 echo hello world 无法执行
end