一.参数的定义
参数传递
形参和实参:
形参:定义 函数时的 参数变量
实参:调用 函数时,使用的参数变量
参数传递的过程,就是 把实参的引用 传递给 形参 ,使用实参的值来执行函数体的过程。
在 Python 中,函数的 实参/返回值 都是是靠 引用 来传递来的
位置实参
按照参数位置,依次传递参数,这是最普通的方式。
def location(a, b) print(
a + b) locat
i
on, 9) “调用函数时,按顺序传递参数,3 传给 a,9 传给 b”
3.关键字传递参数
如果不想严格按照顺序传递参数,也可以按关键字传递。
def location(a, b) print(
a + b)
location(b = 3, a = 9)
“调用函数时,按关键字传递参数,3 传给 b,9 传给 a”
多值参数
当函数需要处理的参数个数不确定时,可使用 多值参数
python 中有两种多值参数:
接收 元组:参数名前加 一个 *
接收 字典:参数名前加 两个 *
一般在给多值参数命名时,习惯使用以下两个名字
*args — 存放 元组 参数
**kwargs — 存放 字典 参数,(kw 即 keyword,kwargs 即 键值对参数)
def demo(num, *args, **kwargs):
print(num) print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name=“小明”, age=18, gender=True)
输出: 1 (2, 3, 4, 5) {‘name’: ‘小明’, ‘age’: 18, ‘gender’: True}
拆包
在上面多值参数传递时,实际上使用了拆包功能。
拆包主要用于元组和字典参数的传递。
在调用带有多值参数的函数时,使用拆包简化参数的传递:
直接将一个 元组变量 实参传递给元组形参 args
在 元组变量前,加 *
直接将一个 字典变量 实参传递给字典形参 kwargs
在 字典变量前,加 **
def demo(*args, **kwargs):
print(args)
print(kwargs)
gl_nums = (1, 2, 3)
gl_xiaoming = {“name”: “小明”, “age”: 18}
“变量名前必须要加 * 号,否则不能无法正常拆包”
"错误演示(不加 * 号):
" demo(gl_nums, gl_xiaoming) 输出: ((1, 2, 3), {‘name’: ‘小明’, ‘age’: 18}) {}
“正确演示(加 * 号):” demo(*gl_nums, **gl_xiaoming) 输出: (1, 2, 3) {‘name’: ‘小明’, ‘age’: 18}
二.常见bug类型
1、SyntaxError
SyntaxError: invalidcharacterinidentifier
#语法错误有无效标识符,检查一下中文符号
SyntaxError: unexpectedEOFwhileparsing
#语法错误,多了无法解析的符号,检查一下是否多了或者少了括号
2、IndexError
IndexError: list indexoutofrange
#索引错误,超出索引范围,检查一下列表是否
3、TypeError
TypeError: must bestr,notint
#数据类型错误,该数据不是正确的数据类型,比如字符串和数字直接拼接,检查一下数据类
4、IndentationError
IndentationError:expected an indented block
#缩进错误,检查一下代码的缩进是否正确
5、KeyError
KeyError:‘fond’
#键错误,字典中没有该的key对应的值,检查一下键名或者字典数据是否正确
6、ValueError
ValueError: substringnotfound
#值错误,输入的数据类型跟要求的不符合
7、NameError
NameError:name’a’isnotdefined
#未初始化对象,变量没有被定义
8、AttributeError
AttributeError:‘tuple’object hasnoattribute’remove’
#属性错误,该对象没有这个属性、方法,检查一下数据类型
9、UnicodeDecodeError
UnicodeDecodeError/UnicodeEncodeError/UnicodeTranslateError
#Unicode 解码/编码/转换/时的错误
三.pycharm调试
step over:单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。
在不存在子函数的情况下和step into效果一样的(简而言之,越过子函数,但子函数会执行)。
step into:单步执行时,遇到子函数就进入并且继续单步执行(简而言之,进入子函数);
step out:当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。