定义函数
def 函数名(函数参数):
函数名只能以字母或下划线_开头,只能含有字母、数字、下划线;
函数不显式调用return函数,会默认返回None
无参数无操作函数
def nothing():
pass
nothing()
无参数有操作函数
def print_ss():
print("pppp")
print_ss()
#pppp
无参数有返回值函数
def agree():
return False
if agree():
print("true")
else:
print("false")
#false
有参数有返回值函数
def echo(anything):
return anything + " " + anything
print(echo("1"))
#1 1
def comm(color):
if color == "blue":
print("blueeee")
elif color == "red":
print("redddd")
elif color == "yellow":
return "yellowww"
else:
print("others")
comm("hhh")
a = comm("yellow")
print(a)
'''
others
yellowww
'''
位置参数
传入参数的值按照顺序依次复制
def menu(a,b,c):
return {"a":a,"b":b,"c":c}
print(menu(1,2,3))
#{'a': 1, 'b': 2, 'c': 3}
关键字参数
调用函数时可以指定对应参数的名字,可以采用与函数定义不同的顺序调用;
def menu(a,b,c):
return {"a":a,"b":b,"c":c}
print(menu(a = 1,c = 3,b =2))
#{'a': 1, 'b': 2, 'c': 3}
可以同时使用位置参数和关键字参数调用函数,但是位置参数要放在关键字参数之前。
def menu(a,b,c):
return {"a":a,"b":b,"c":c}
print(menu(1,c = 3,b = 2))
#{'a': 1, 'b': 2, 'c': 3}
指定默认值参数
默认值参数要放在不含默认值的参数后面
def menu2(a,c,b = "bbb"):
return {"a":a,"b":b,"c":c}
print(menu2(1,3))
print(menu2(1,2,3))
'''
{'a': 1, 'b': 'bbb', 'c': 3}
{'a': 1, 'b': 3, 'c': 2}
'''
使用*收集位置参数(不是指针)
将一组可变数量的位置参数集合成参数值的元组,只能放在所有参数的最后
def print_args(a,b,*args):
print(a)
print(b)
print("测试*输出",args)
print_args(1,2,3,4,5,6,7,8)
'''
1
2
测试*输出 (3, 4, 5, 6, 7, 8)
'''
使用**收集关键字参数
将参数收集到一个字典中,参数的名字是字典的键,参数的值是字典的值。
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(a = "aaa",b = "bbb")
#{'a': 'aaa', 'b': 'bbb'}
文档字符串
可以在函数体的第一行使用一对三个单引号 ''' 或者一对三个双引号 """ 来定义文档字符串。
可以使用help(函数名)函数得到参数列表和规范的文档;
可以使用__doc__得到文档字符串(双下划线)
def print_kwargs(**kwargs):
"""
这是一个用**收集关键字参数的函数
"""
print(kwargs)
help(print_kwargs)
print(print_kwargs.__doc__)
'''
print_kwargs(**kwargs)
这是一个用**收集关键字参数的函数
这是一个用**收集关键字参数的函数
'''
函数可以作为参数被其他函数调用
def answer():
print(42)
answer()
def run_something(func):
func()
run_something(answer)
#42
#42
def add_args(arg1,arg2):
print(arg1+arg2)
def run_something_with_args(func,arg1,arg2):
func(arg1,arg2)
run_something_with_args(add_args,5,9)
#14
def sum_args(*args):
return sum(args)
def run_sum_args(func,*args):
return func(*args)
print(run_sum_args(sum_args,1,2,3,4,5))
#15
内部函数
在一个函数内部定义另一个函数
def outer(a,b):
def inner(c,d):
return c+d
return inner(a,b)
print(outer(1,2))
#3
闭包
内部函数可以看作一个闭包;闭包是一个被动态创建的可以记录外部变量的函数。
def knight2(saying):
def inner2():
return "knight:'%s'"%saying
return inner2
a = knight2("hhh")#a是一个函数、闭包
print(a)
print(type(a))
print(a())
'''
<function knight2.<locals>.inner2 at 0x00000177C73D7310>
<class 'function'>
knight:'hhh'
'''
lambda()函数:匿名函数
lambda 函数接收参数,在冒号和末尾圆括号之间的部分为函数的定义
def edit_story(words,func):
for word in words:
print(func(word))
list99 = ["abc","def","ghi","jkl"]
def ww(word):
return word
edit_story(list99,ww)
edit_story(list99,lambda word:word)
'''
abc
def
ghi
jkl
abc
def
ghi
jkl
'''
使用try、except处理错误
在try中的代码块会被执行,如果遇到错误,会抛出异常。然后执行except中的代码;如果没有错误,则会跳过except代码
list1 = [1,2,3,4,5]
try:
print(list1[6])
except:
print("输出超长")
try:
print(list1[3])
except:
print("输出超长")
#输出超长
#4
except exceptiontypes(异常类型) as name(具体描述) 获取整个异常对象
while 1:
a = input()
if a == "q":
break
try:
c = 10/int(a)
print(c)
except ZeroDivisionError as name1:
print(name1)
except BaseException as name2:
print(name2)
'''
1
10.0
100
0.1
0
division by zero
hh
invalid literal for int() with base 10: 'hh'
oo
invalid literal for int() with base 10: 'oo'
q
'''
编写异常
python标准异常
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |