Python理论3 函数

自定义函数

在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]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值