Python-函数&类
一、函数
1.定义一个名字对应多个语句操作,称之为定义函数
definition=def 定义
所以:定义函数 就好像是给 一段代码 起了个名字
# def关键字,表示定义一个函数
# interview,表示函数的名字
# (),括号里面可以填参数
# :,冒号,下面的代码需要缩进,称之为函数体
def interview():
print("把求职者带到3号会议室")
print("请求职者 完成答卷")
print("让测试经理来面试 求职者")
print("让技术总监面试 求职者")
定义函数并调用它
# 定义一个函数
def getup(who):
print(f'{who}终于起床啦')
# 调用定义的getup函数==>调用函数/执行函数
getup('丁大侠')
2.内置函数
print这种就是内置函数
https://docs.python.org/3/library/functions.html
# 字符串转化为对应的整数,返回整数1000
int('1000')
# 小数转化为对应的整数,返回整数3456
int(3456.23)
# 字符串转化为对应的小数,返回 浮点数 1000.0
float('1000')
# 一个整数对象转化为对应的小数对象,返回浮点数 1000.0
float(1000)
# 数字转化为对应的字符串表示的数字,返回字符串 '1000.23'
str(1000.23)
# 获取一个数据对象的长度
# 通常用来获取 字符串、列表、元组、字典等类型对象的元素个数
print (len('你好!'))
# 得到一个数据对象类型,返回 <class 'int'>
type(3)
# input获取用户输入内容
salary =
3.函数的参数
参数的作用:提供函数完成功能,所必须的信息
参数可以没有,可以有一个,也可以有多个,用,隔开
4.函数的返回值return
姑且叫它意义吧:有的函数执行,需要返回一个结果给调用者
就必须使用 return关键字,后面加上返回的结果对象
# 计算长方形的面积,长为a,宽为b
# 一旦执行了函数中的 return 语句,就会立即从函数中返回到调用的地方,该函数下面还有代码,也不会再执行了
def cf_area(a,b):
return (a+b)*2
s=cf_area(20,15)
print(f'长方形面积为{s}')
如果一个函数定义,里面并没有写return语句
# 函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
# 因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑
# 如果没有return语句,函数执行完毕后也会返回结果,只是结果为None,return None可以简写为return
def squarep(num1,num2):
ret = num1**2 + num2**2
# 输出结果为5
print(ret)
ret = squarep(1,2)
# 输出结果为 None,None对象是Python内置的,表示没有数据内容的对象
print(ret)
5.缺省值参数
缺省值参数-->缺省默认值的意思
# 在定义函数的时候,给它加上缺省值score=60
def overScoreStudents(studentScoreList, score=60):
count = 0
# 下面的代码用到了循环和判断,后面章节会学习到
for ss in studentScoreList:
if ss >= score:
count += 1
return count
# 如果score参数还是传入60 就可以不用写了
overScoreStudents(ssList
缺省值
# 一旦有缺省值后,后面所有的参数必须都有缺省值
def func(arg1, arg2, arg3=3, arg4):
6.指定参数名调用函数
# 指定参数名调用函数
# 可以混合
# 可以颠倒
# 一旦某个参数指定了参数名,后面所有的参数必须指定参数名
func( 1, 2, arg3=3,arg4='hello')
7.变量的有效范围
定义在某个函数内部的变量,称之为 局部变量
定义在所有函数外部的变量,称之为 全局变量
范围覆盖:
# global upChars 这行声明,表示 upChars 这个名字对应的是全局变量 upChars
upChars = '零壹贰叁肆伍陆柒捌玖'
def change():
global upChars
upChars = '零一二三四五六七八九'
change()
print(upChars
8.函数的参数
定义函数时的参数为形式参数,也叫行参
==>默认值形参、位置形参、关键字形参、个数的可变位置形参、个数可变的关键字形参
调用函数时的参数为实际参数,也叫实参
==>(默认值实参-无)、位置实参、关键字实参、个数可变的位置实参、个数可变的关键字实参
-形式参数
# a,b,c在函数的定义处,所以是形式参数,也叫形参
def test(a,b,c):
print(a,b,c)
# b在函数的定义处,所以b是形参,而且进行了赋值,所以b称为默认值形参
def fun1(a, b=10):
print(a, b)
# 位置形参
def fun(a,b,c):
# 关键字形参
def fun(a=1,b=1,c=2):
# 个数可变的位置形参
def fun2(*args):
print(agrs)
fun2(1,2,3,4,5)
# 个数可变的关键字形参
def fun3(**args2):
print(args2)
fun3(a=1,b=2,c=3,d=4)
-实际参数
# 函数调用时的参数是参数传递,是位置传参
# 10,20,30==>位置实参
fun(10,20,30)
lst = [11, 22, 33]
# 在函数调用时,将列表中的每个元素都转换为位置实参传入
# *lsi==>可变个数的位置实参
fun(*lsi)
# 将10赋值给a... ==>关键字实参
fun(a=10,b=20,c=30)
# 在函数调用时,将字典的键值对都转换为关键字实参传入
# **dic==>可变个数的关键字实参
dic = {'a' :10,'b' :20, 'c' :30}
fun(**dic)
-可变参数实例
可变参数就是传入的参数个数是可变的
变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
# 定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。
# 在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。
# 但是,调用该函数时,可以传入任意个参数,包括0个参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2, 3)
14
*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
>>> nums = [1, 2, 3]
>>> calc(*nums)
-关键字参数实例
键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
# 函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
# 传入任意个数的关键字参数
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
组装出一个dict,然后,把该dict转换为关键字参数传进去
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
# 简化的写法
# kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
-命名关键字参数
# 限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数
# 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
def person(name, age, *, city, job):
print(name, age, city, job)
二、类
Python中自定义对象类型,就是 定义一个类 , 类 就是 类型 的意思
1)类名首字母大写
2)类属性(类名.属性名)、类方法(类名.方法名)
3)init 初始化方法
-首先,解释器会 在内存中 创建一个该类 的 实例对象;然后,解释器会查看这个类是否有 init方法,如果有,就会去调用它。__init__ 是 创建好实例后 立即就要 执行 的方法,所以称之为初始化方法。
-主要就是创建该实例的 实例属性
3)类的实例化 car1 = BenCar()
类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;
类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
1.类属性
(类变量)
直接写在类里的变量,称为类属性
所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。
类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用
2.实例属性
(实例变量)
实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量
定义在类方法中的变量为实例变量(或者实例属性)
3.类的实例方法
特点最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)
4.类的构造方法
(属于特殊的实例方法)
构造方法用于创建对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它
即便不手动为类添加任何构造方法,Python 也会自动为类添加一个仅包含 self 参数的构造方法
5.类方法
Python 类方法和实例方法相似,它最少也要包含一个参数,
只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。
也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
class CLanguage:
#类构造方法,也属于实例方法
def __init__(self):
self.name = "baidu"
self.add = "baidu.com"
#下面定义了一个类方法
@classmethod
def info(cls):
print("正在调用类方法",cls)
类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)
#使用类名直接调用类方法
CLanguage.info()
#使用类对象调用类方法
clang = CLanguage()
clang.info()
6.类的静态方法
静态方法,其实就是我们学过的函数
和函数唯一的区别是,静态方法定义在类这个空间中而;函数则定义在程序所在的空间中。
静态方法需要使用@staticmethod修饰
class CLanguage:
@staticmethod
def info(name,add):
print(name,add)
静态方法的调用,既可以使用类名,也可以使用类对象
#使用类名直接调用静态方法
CLanguage.info("baidu","baidu.com")
#使用类对象调用静态方法
clang = CLanguage()
clang.info("baidu","baidu.com")
7.tips
在实际编程中,几乎不会用到类方法和静态方法,因为我们完全可以使用函数代替它们实现想要的功能,
但在一些特殊的场景中(例如工厂模式中),使用类方法和静态方法也是很不错的选择。

浙公网安备 33010602011771号