函数的基本概念
语法:
def func_name(参数): pass # 空函数就使用pass,代表什么都没有
def 是define的简写。函数如果没有返回值,默认(return None)
函数的参数:
1)参数是写在括号中的,如果是可选参数,参数后面跟一个默认值,如下:
def func_name(m=3):2)如果是必选参数,参数后面没有默认值。如下:
def func_name(m):
函数的健壮性:
1)永远知道你的方法会返回什么(异常处理,条件判断)
2)返回你想要的结果
判断函数的参数类型
例如:使用isinstance判断参数是否都是数字
def add(num1,num2): if isinstance(num1,int) and isinstance(num2,int): return num1 + num2 else: return "参数里有不是数字的类型"
断言测试
最常用的测试方法,断言就是异常。例如:
assert add(2,3) == 5 assert add(1,2) == 4
不建议把断言放在程序控制流程中,但是,将断言放在流程中,有问题就会崩溃,可以更快的找到错误。断言的内部实现:
if __debug__: if not (断言的条件): raise 断言异常
简单的函数
定义一个方法 get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。
其他类型则报错,并且返回一个偶数列表。(注:列表里面的元素为偶数)。
def get_num(nums): if not isinstance(nums,list): return "输入的参数不是列表类型" else: numList = [] for n in nums: if not isinstance(n,int): return "列表里面的元素不是数字类型" else: if n % 2 == 0: numList.append(n) return numList if __name__ == '__main__': ls = [1,2,3,4,5] print("输出结果:",get_num(ls)) assert get_num([3,4,25,6]) == [3,4,25,6] assert get_num([1,3,'aa','qwer']) == "列表里面的元素是数字类型" assert get_num((1,2,3,4,5,10)) == "输入的参数不是列表类型"
函数的作用域
1>在函数中修改全局变量其值
global arg arg = 1 def fun1(): global arg # 里面也要定义一遍 arg = 3 fun1() print(arg)
2>在函数中引入可变参数,因为可变参数本身是可以被修改的,所以,在函数中引入可变参数是十分危险的
def fun1(arg): if not isinstance(arg,list): return "输入的不是列表类型" # 修改列表的第一个参数值 arg[0] = 5 return arg tlist = [1,2,3,4,6] print(tlist,"\n",fun1(tlist)) """ 输出结果:列表本身被修改 [5, 2, 3, 4, 6] [5, 2, 3, 4, 6] """
函数的魔术方法
定义函数的时候,有些时候我们想拿到他的内部的一些信息和属性,这时我们可以利用函数内部自己的一些魔术方法,这样可以很快的拿到一些它的数据,例如:
def fun1(arg1,arg2): return arg1 + arg2 print(dir(fun1.__code__)) # 查看code方法的属性 """ ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_kwonlyargcount', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames'] """ print(fun1.__code__.co_varnames) # 查看方法的参数的名称 """ ('arg1', 'arg2') """ print(fun1.__code__.co_filename) # 查看当前代码文件的路径 """ /Users/admin/PycharmProjects/untitled1/venv/LearnText/Test1.py """ print(help(fun1.__code__))