自定义函数
在python中我们可以调用各种各样的函数(内置函数、标准库函数、外部模块函数),但是在实际编写代码时,我们往往要自己设计函数来实现设计要求,让我们来认识一下def 。
语法
- 关键词 def
- 函数名
- 参数(可以是多个参数)
- 冒号
- 另起一行,代码块
- return
代码示例:
def function(params):
somthing
return values
来个实例:
def tansfer(spam):
print(",".join(spam[:-1])+" "+"and"+" "+spam[-1])
spam=['apples', 'bananas', 'tofu', 'cats']
tansfer(spam)
执行结果:
apples,bananas,tofu and cats
返回值和Return
返回值定义: 返回值是一个函数的处理结果
在定义一个函数时, 可以使用return语句指定返回值。
TIPS:
1、return是一个函数结束的标志,函数内可以有多个return,但只要执行一次,整个函数就会结束运行。
2、return 的返回值无类型限制,即可以是任意数据类型
3、return 的返回值无个数限制,即可以用逗号分隔开多个任意类型的值。ps:不写return默认会在函数的最后一行添加return None
举例:
#函数中return有两个作用
#1.返回函数执行的结果
def test1(a,b):
print('......')
return a+b
rs = test1(100,200)
print(rs)
#2.结束函数的执行
def test2(a):
print('-----')
if a == 10:
return
#return下方的代码就不会在执行了
print('************')
test2(10)
#3.在函数中,返回多个值,返回的多个值,放在一个元组里
def test3():
return 1,2,3,4,5,6,7,8,9
rs = test3()
print(rs)
None
1.Python在没有return的函数末尾隐式添加了return none
2.跟上一条类似的是在for和while循环末尾隐式添加了continue.
3.它属于数据类型nonetype.
关键字参数和print( )
关键词参数通常用于可选函数中,由函数调用中放在它们前面的关键词识别,如:print( ),中有关键词参数end以及sep。
其中关键词参数指定参数末尾打印何值,sep指定在参数间打印何值。
代码示例:
print('Hello', end='')
print('World')
print('cats', 'dogs', 'mice', sep=',')
执行结果:
HelloWorld
cats,dogs,mice
PS:print( )函数在末尾一般隐式添加一个换行符,如果用end关键字参数指定参数末尾指定为空,可以打印出参数在一行的效果。
函数的参数
在Python中,函数的参数可以有默认值,也支持使用可变参数,所以可以设定默认值,但是在实际调用过程中可以根据需求对变量赋值。
from random import randint
def roll_dice(n=2):
"""
摇色子
:param n: 色子的个数
:return: n颗色子点数之和
"""
total = 0
for _ in range(n):
total += randint(1, 6)
return total
def add(a=0, b=0, c=0):
return a + b + c
# 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))
更好的方案:
# 在参数名前面的*表示args是一个可变参数
# 即在调用add函数时可以传入0个或多个参数
def add(*args):
total = 0
for val in args:
total += val
return total
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
局部变量及全局变量
局部变量:定义在函数内部的变量称为局部变量,他的作用域范围为函数内,也就是出了函数外就无效。
全局变量:定义在函数外的变量称之为全局变量,他的作用域范围为全局。
所以全局变量跟局部变量主要是针对函数内外而言的,局部变量只能在函数内部使用,而全局变量是全局范围内都能引用。
Tips:
1.局部变量与全局变量被修改时主要是看代码的作用域,例如在建立函数时,在函数内的作用域内局部变量会被修改,在函数结束时由于作用域的消失局部变量也随之消失。
2.如果在函数中要修改全局变量可使用globe函数。
3.函数中可以使用全局变量,但不改变全局变量值。
当你将对象作为参数传递给函数时,新的局域变量创建了对原始对象的引⽤,⽽不是复制。如果在函数⾥绑定⼀个新对象到⼀个变量,这个变动不会反映到上⼀层。因此可以改变可变参数的内容。假设有以下函数:
def append_element(some_list, element):
some_list.append(element)
data = [1,2,3]
append_element(data,4)
输出
data=[1,2,3,4]
异常处理
针对python里出现的语法错误和不被程序处理的异常,为了让程序继续运行,这个时候就需要我们捕捉异常,通过捕捉到的异常,我们再进行相应的处理。通过try-except来处理,我们把所有可能引发错误的语句放在try块中,然后在except从句/块中处理所有的错误或异常。except从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误/异常。如果没有给出错误或异常的名称,它会处理所有的错误和异常。对于每个try,至少都有一个相关联的except从句。
举例说明:
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
在这串代码中由于除以零是错误的,故报错 ZeroDivisonError (在除数为零发生的一个异常),需要注意的是在使用异常处理时,except后面要指明异常类型。
执行结果为:
21.0
3.5
Error: Invalid argument.
42.0
值得注意的是异常处理同时可以用于函数之外,代码:
def spam(divideBy):
return 42 / divideBy
try:
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
except ZeroDivisionError:
print('Error: Invalid argument.')
执行结果如下:
21.0
3.5
Error: Invalid argument.
未执行print(spam(1))的原因是,一旦执行跳转到except子句中的代码,它就不会返回try子句。相反,它只是像往常一样继续执行。
常见异常类型
Exception 所有异常的基类(当不知道具体的异常可用这个处理)
AssertionError assert语句失败
AttributeError 特性应用或赋值时引发(试图访问一个对象没有的属性)
IOError 试图打开不存在的文件或者无全新的文件等操作时,就会引发(输入输入异常,基本是无法打开文件)
ImportError 无法引入模块或包,基本是路径问题
IndexError 在使用系列中不存在的索引时引发(下标索引超出序列边界)
KeyError 试图访问你字典里不存在的键key
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个未被赋予对象的变量
SyntaxError Python代码逻辑语法出错不能执行
TypeError 传入的对象类型与要求不符
UnboundLocalError 试图访问一个还未被设置的全局变量,基本上是由于另有一个同名的全局变量
ValueError 传入一个不被期望的值,即使类型正确
random模块
random模块在机器学习初始化中是一个很重要且有用的模块,在这里介绍一下。
语法就是import random
下面是常见的几种函数:
1.random.random
随机生成[0.1)的浮点数
import random
print(random.random())
#运行结果:0.4041810247152263
2.random.uniform
原型为:random.uniform(a, b),用于生成一个指定范围内的随机浮点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。
import random
print(random.uniform(10,20))
print(random.uniform(20,10))
#运行结果为19.319774059417643
# 11.25780294472681
3.random.randint
原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b(闭区间)
print(random.randint(12, 20)) #生成的随机数n: 12 <= n <= 20
print(random.randint(20, 20)) #结果永远是20
#print(random.randint(20, 10)) #该语句是错误的。下限必须小于上限。
4.random.choice
原型为:random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence(字典和集合都是无序的)
import random
print(random.choice("Python没那么简单") )
print(random.choice(['Jason', 'is', 'so', 'handsome']))
print(random.choice(('Tuple', 'List', 'Dict')))
5.random.sample
原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。(sample函数不会修改原有序列)
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
slice = random.sample(list, 5) #从list中随机获取5个元素,作为一个片断返回
print(slice)
print(list) #原有序列并没有改变。
#运行结果[2, 10, 8, 7, 9]
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
6.random.shuffle
原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱。
import random
L=[1,2,3,4,5,6,7]
random.shuffle(L)
print(L)
#运行结果[6, 7, 2, 5, 3, 4, 1]