Python函数和类

一、Python函数

任何程序里面包含的不是函数就是类,Python也是如此。

函数的定义

函数的作用有两个:①模块化编程 ②代码重用

函数是独立的,完成特定功能的代码段,在Python程序中,所有的一切都是函数,大多数是有名函数,也存在匿名函数。

#函数的基本语法:
def 函数名称([参数1,参数2,.....]):  #这里的参数是形式参数
    函数体
    ...
    [return 返回值] 
#尽量使用return来进行函数值的返回
函数的参数(形参和实参)

在函数定义和调用的时候,我们能根据自己的需求来实现参数的传递,函数的参数有两种形式:形参和实参。

形参:在函数定义的时候,括号中所编写的参数成为形式参数。

实参:在函数调用的时候,传递的参数成为实际参数

def hello(name):#name是定义时所编的形式参数,这里name是局部变量
    return name
mingzi  ='Mrzhang'
greet(mingzi)#函数调用时,括号内传递的是实际参数

函数的参数类型:位置参数、关键词参数、缺省参数,不定长参数、

在函数定义时,我们可以定义多个参数,但是在函数调用时,我们也应该传递多个参数,正常情况下,要一一对应。

位置参数:

def student(name,age,mobile):
    print(f'学生的名字交{name},今年{age}岁了,联系方式是{mobile}')
#传递实参要一一对应
student('zhangsan',20,'1310389090')
    #顺序不能颠倒,否则意思就会改变,所以该参数也叫位置参数

关键词参数:

def student(name,age,mobile):
    print(f'学生的名字交{name},今年{age}岁了,联系方式是{mobile}')
#传递实参要一一对应
student(name='zhangsan',age=20,mobile='1310389090')
#通过键=值的形式指定内容,让函数更加清晰,即使位置改变,意思也不会改变。

缺省参数:也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不穿该默认值。

注意:定义缺省参数时,一定要把它卸载参数列表的最后面。

def student(name,age,gender='male'):
    print(f'学生的名字交{name},今年{age}岁了,联系方式是{mobile}')
#传递实参要一一对应
student('zhangsan',20)
student('lisi',21,female)
student('wanger',18)

不定长参数:也叫可变参数

#用于不确定调用的时候会传递多少个参数(无参数也可)的场景
#分为包裹位置和包裹关键字参数
##包裹位置参数
def student(*args):#args 元组类型数据对传递参数有顺序要求
     print(f'学生的名字交{name},今年{age}岁了,联系方式是{mobile}')
student('zhangsan',20,'1310389090')
        
#包裹关键字参数
def student(**kwargs):
 #kw=keyword+args
 #kwargs字典类型数据,对传递参数没有顺序要求,格式要求key=value
     print(f'学生的名字交{kwargs["name"],今年{kwargs["age"]岁了,联系方式是{kwargs["mobile"]}')

Python组包:把多个数据组成元组或字典的过程。无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。

Python拆包(元组和字典)

拆包:对于函数中的多个返回数据,去掉元组,列表或者字典 ,直接获取里面数据的过程。

#元组的拆包过程
def func():
    return 100,200 #返回多个值,使用tuple元组类型数据
#定义两个变量接受元组中的每个数组进行拆包
num1,num2=func()
print(num1)
print(num2)
#结果为 100 ,200

#字典的拆包过程
dict1 = {'name':'小明', 'age':18}
a, b = dict1
print(a)
print(b)
# 获取字典中的数据
print(dict1[a])
print(dict1[b])
函数的变量(局部变量和全局变量)

在Python中,定义在函数外部的变量称之为全局变量;定义在函数内部的变量称之为局部变量。

#全局变量作用范围:在整个程序范围内都可以直接使用
#局部变量作用范围:在函数调用的过程中,开始定义,函数运行的过程中生效,执行完毕之后,进行销毁。(可以了解Python的垃圾回收机制)
num=1
def func():
    i=1
#num 为全局变量,i为局部变量

思考:能不能在局部作用域中对全局变量进行更改?

答:global关键字

num=10
def funca():
    global num 
    #若没有这一句,输出的num会等于 10,并没有更改全局变量
    num =20
funca()
print(num)
#global关键字可以用于多函数之间的数据共享
关于return返回值问题:

(1)如果一个函数有两个return,程序如何执行?

def return_text():
    return 1
	return 2
reslut=return_text()
print(result)
#结果是返回 1 ,因为return可以退出当前函数,第一个return下面的代码就不执行了

(2)如果一个一个函数有多个返回值,该如何书写?

def return_text():
    return 1,2
result=return_text()
print(result)
#在python中,一个函数只能返回一个结果,如果想要返回多个结果,可以使用元组的形式,在学习元组时也有讲到过,元组可以返回多个值。
#可以查看结果类型,type(result)
函数的调用:

在Python中函数和变量一样,都是先定义后进行调用

#基本语法:
def hello(name):
    return name+',hello!'
result=hello('Mrzhang') #直接使用函数名进行调用,赋值给str
print(result) 
#打印结果
函数的嵌套

函数的嵌套调用:一个函数里面又调用了另外一个函数。

Python代码执行遵循一个顺序原则: 从上往下,从左往右,一行一行地执行。

def funcA():
    print('this is function A.')
def funcB():
    print('*' * 40) # 可以打印40个*
    print('this is function B')
    funcA()
    print('*' * 40)
funcB()
#代码运行顺序(按照行数):1 3 8 4 5 6 2 7

代码执行流程:

执行第1行时仅仅定义了funcA函数,内部代码没有执行,跳过第2行继续执行,

执行到第3行,定义funcB函数,并没有真正的调用和执行。

代码跳到第8行,funcB函数,调用funcB并且执行内部代码,程序返回第4行

执行第4行,打印字符,并继续执行,直到第6行调用函数funcA(),跳到第2行。

第二行执行完毕后,返回funcB,继续第7行,打印字符串。

Python的内置函数:

内置函数无须从模块中导入,也不用定义 就可以直接在任意位置直接调用。

#一些常用的内置函数
abs(-1):求绝对值,返回1 
max([1,2,3]):求序列中最大值,可以是列表或元组
min(2,3,4):求序列中最小值,可以是列表或元组
divmod(6,3):取模,返回一个元组,包含商和余数
int(3.9):转换成整数,去尾转换,结果为3
float(3):转换成浮点数
str(123):转换成字符串
list((1,2)):元组转换为列表
tuple([1,2]):列表转换成元组
len([1,3,5]):求序列长度,可以是列表或元组
9.Python文件操作方法(读写)

open函数负责新建、打开文件,并返回操作对象。

read方法将文件内容读取到内存。

write方法将指定内容写入文件

close方法关闭文件,open文件后必须有close文件。

#open函数的语法
open(filename[,mode,encoding=])
'''
filename 要打开或新建的文件地址或者名称,字符串形式,例如 text.txt 或者E:/python/text.txt
mode 文件访问模式,只读,只写,读写等等,可选参数,有参数列表,默认模式为只读
encoding= 编码解码的标准,如果文件中包含中文信息,需要制定encoding=utf-8

'''
实例:
f=open('test.txt','a+',encoding='utf-8')
data=f.write('Hello World')
read=f.read()
print(read)