函数的创建与调用
创建一个函数
形式为def functionname(参数):
ps:当有comment参数的时候,可以使用函数名.__doc__或者help(函数名)获取
举例:
def fiterchar(string):
"""
功能:过滤危险字符(如黑客等),并且将过滤后的结果输出
string是需要过滤的字符串
无返回值
"""
import re #引入re模块
pattarn = r"(黑客)|(抓包)|(监听)" #模式字符串
sub = re.sub(pattarn,"@_@", string) #进行模式替换
print(sub)
print(fiterchar.__doc__) #输出函数的功能说明
但是除了输出了函数的说明,没有别的反应了,因为没有调用别的函数
调用函数
functionname(parametersvalue)
即函数名(参数)
这就是函数的调用
举例: 输出每日一贴
在函数中,从励志文字列表中获取一条励志语句输出,最后调用这个函数
def function_tips():
"""
功能:每日输出一条励志语句
无返回值
"""
import datetime #模块引入
#定义一个列表
mot = ["坚持下去不是因为我强大,而是我别无选择",
"含泪播种的人一定会笑着收获",
"做对的事情比把事情作对重要",
"命运给予我们的不是失望之酒,而是希望之杯",
"明日永远新鲜如初,一尘不染",
"求知若渴,虚心若愚",
"成功属于那些从来不说不可能的人"]
day = datetime.datetime.now().weekday() #获取当前日期
print(mot[day]) #输出当前日期对应的名句
#**********************调用函数*********************#
function_tips() #调用函数
参数传递
了解形式参数和实际参数
形参:就是函数括号里的那个参数
实参:就是实际应用的那个参数,传入函数中使用
个人最直观的理解就是,实参是个座位号,而实参就是要坐在那里的那个人,人会变,但是那个位置一直都在那个地方
注意
根据实际参数的类型不同,还可分为两种情况
1,是将实参的值传递给形参。
2,是将实参的引用传递给形参。
其中,当实参不可变时,进行值传递;当实参可变时,进行引用传递。
再明白一点,进行值传递后,改变形参的值,实参不变;而进行引用传递后,改变形参,实参也改变
咱们还是举个例来说明这个问题
#定义函数
def demo(obj):
print("原值:",obj)
obj += obj
print("=========值传递=========")
mot = "我热爱学习"
demo(mot)
print("函数调用后:",mot)
print("=========引用传递========")
list1 = ["小王","小红","小牌"]
demo(list1)
print("函数调用后:",list1)
结果呢
=========值传递=========
原值: 我热爱学习
函数调用后: 我热爱学习
=========引用传递========
原值: ['小王', '小红', '小牌']
函数调用后: ['小王', '小红', '小牌', '小王', '小红', '小牌']
原因就是字符串不能被改变而列表可以
位置参数
就两点
1:数量与定义时一致
2:位置与定义时一致
举例:
def fun(number,name):
那么调用时
fun(1,“小帅”)
关键字参数
这个就灵活了
还是上面这个例子
fun(number = 1,name = "小帅")或者
fun(name = "小帅",number = 1)
都可
就是能对应即可
设置默认值
就是在定义的时候就定义上一个默认的参数
def fun(number,name = "小帅")
这样调用时就能少写一个参数name
当然你也可以写
就比如:
def fun(number,name = "小帅"):
print(number)
print(name)
fun(1,"小李")
结果是:
1
小李
可以,但是没必要,你都定义好了,为啥要改呢
一定要注意,默认的参数要写在不默认的后面不然会报错
可变参数
*args
这个表示接收多个实际参数并将其放在一个元组里.
还是老样子举例:
def printcoffee(*coffeename):
print("我喜欢的咖啡有:")
print(coffeename)
for item in coffeename:
print(item)
printcoffee("蓝山","卡布奇诺","摩卡")
结果是:
我喜欢的咖啡有:
('蓝山', '卡布奇诺', '摩卡')
蓝山
卡布奇诺
摩卡
可以直观地看到这是元组
parameter
这个形式表示接受任意多个类似关键字参数一样显式赋值的实际参数,并将其放在一个字典内.
举例:
def printsign(**sign): #定义输出姓名和星座的函数
print() #输出一个空行,好看一点
print(sign)
for key,value in sign.items(): #遍历字典
print("["+key+"]"+"的星座是:"+value) #结果
printsign(小王 = "水瓶座",小李 = "白羊座")
结果
{'小王': '水瓶座', '小李': '白羊座'}
[小王]的星座是:水瓶座
[小李]的星座是:白羊座
类型联合运算符
def square(number:int)->int:
return number**2
print(square(5))
结果
25
这个方法就直接限定参数的类型
多个参数有点小问题要注意一下
def square(number : int |float)->int|float:
return number**2
print(square(7))
代码有啥问题
您提供的代码定义了一个名为 square 的函数,该函数接受一个参数 number,这个参数可以是整数(int)或浮点数(float),并返回该数字的平方。代码使用了类型注解来指定参数和返回值的类型。然后,它调用这个函数并打印数字 7 的平方。
代码本身在逻辑上是正确的,并且能够按预期工作。当执行 print(square(7)) 时,会输出 49,因为 7**2 等于 49。
然而,从类型注解的角度来看,代码中指出函数既可以接受 int 或 float 类型的输入,也可以返回 int 或 float 类型的结果。这种类型注解的方式是合理的,但需要注意的是,如果你使用的是 Python 3.9 以下的版本,这种类型注解的语法(使用 | 来表示联合类型)是不被支持的。在 Python 3.9 及以上版本,这种写法是有效的。
如果你的环境是 Python 3.9 以下版本,而你想要实现相同的功能,你可以使用 typing 模块中的 Union 来表示参数可以是多种类型之一:
python
from typing import Union
def square(number: Union[int, float]) -> Union[int, float]:
return number ** 2
print(square(7))
此外,关于返回类型的注解 -> int | float,虽然在大多数情况下这样写是没有问题的,但要注意,如果输入是整数,返回的也将是整数;如果输入是浮点数,返回的也将是浮点数。这里使用 int | float 是正确的,因为它反映了函数根据输入类型返回不同类型的行为。
总的来说,除了可能的Python版本兼容性问题外,您的代码是正确的,并且能够正确执行其预期功能。
返回值
return+返回值
如果没有return语句,那就直接返回none
有了return,再想利用其中的值,可以使用print输出
变量的作用域
局部变量
是指在函数内定义和使用的变量,正在函数内有效
举例:\
def fun():
message = "今天天气真不错"
print("局部变量message=",message)
fun()
print(message)
结果:
Traceback (most recent call last):
File "D:/Pythonfile/1/NewPythonLearn/def.py", line 88, in <module>
print(message)
NameError: name 'message' is not defined
局部变量message= 今天天气真不错
会报错,因为再函数结束时,这个message就已经没了,所以就不能在输出message了
全局变量
全局变量一般有两种情况:
1:函数外定义的,可以再函数在访问,也可在内部访问
2:在函数内定义的,可以使用global关键字提权,从局部变成全局变量
举例:
message = "今天天气真不错"
print("函数外部:message=",message)
def fun():
global message
message = "今天天气其实也一般"
print("函数内部:message=",message)
fun()
print("函数调用后:message=",message)
结果
```python
函数外部:message= 今天天气真不错
函数内部:message= 今天天气其实也一般
函数调用后:message= 今天天气其实也一般
就是在函数内把全局的改变了
匿名函数
形式如下:
result = lambda a:a的功能
算了,直接上例子吧
import math
r = 10
result = lambda r:math.pi*r*r
print("面积为:",result(r))