【python3】3.函数、类、模块
创始人
2024-01-21 06:46:50
2022.11.15 本学习内容总结于莫烦python:3.函数、类、模块
https://mofanpy.com/tutorials/python-basic/interactive-python/function

1. Function 函数

我常会重复写一些功能,比如查询文件时间,查询文件名字等等.后续我只需要引用到这个功能,多省事

1.1 定义函数

def modify_name(filename):filename += ".txt"filename = "my_" + filenameprint(filename)modify_name("f1")
modify_name("f2")
my_f1.txt
my_f2.txt

实现了服用。这种服用形式也可以没有参数、有返回值:

  • 没有参数
def my_func():filename = "f1"ext = ".txt"total_name = filename + extprint(total_name)my_func()
f1.txt
  • 有返回值
def modify_name(filename):filename += ".txt"filename = "my_" + filenamereturn filenamenew_filename = modify_name("f1")
print(new_filename)
my_f1.txt

1.2 参数设置

可以输入,可以有默认;我们在覆盖默认的时候,一定要指明覆盖的哪个默认数据 a=2

def f(x, a=1, b=1, c=0):return a*x**2 + b*x + c*1print(f(2, a=2))
print(f(2))
10
6

1.3 全局和局部变量

def modify_name():filename = "f1.txt"print("local filename:", filename)modify_name()
print("global filename:", filename) # 这里会报错

这里会报错:因为filename外面看不见,是个局部变量;

  • 解决方法一:把变量移到函数外面,变全局变量
filename = "f1.txt"def modify_name():print("local filename:", filename)modify_name()
print("global filename:", filename)
  • 解决方法二:用global,变全局变量
filename = "f1.txt"
def modify_name():global filename  # 提出申请filename = "f2.txt"print("local filename:", filename)
modify_name()
print("global filename:", filename)  

实例演示:汉罗塔次数实现】:https://blog.csdn.net/wistonty11/article/details/123563309

羊老羊讲解】我们既要实现time函数外初始化,又要实现在里面结算后带出来结果,所以将timeglobal写成了全局变量。

time = 0
def hanoi(A, B, C, n):global timeif n == 1:print(A, '->', C)time += 1else:hanoi(A,C,B,n-1)print(A, '->', C)time += 1hanoi(B,A,C,n-1)hanoi('A','B','C',4)
print(time)

2 class 类

2.1 定义Class

只要我们有了函数之后,作为一个程序语言,也不缺啥了, 那为什么还要搞一个 类Class 出来呢?永远记住,搞出这个东西来,永远都只有一个目的,就是让用语言觉得更省事, 更方便地处理一些具体问题。

就是工程师们想要在程序中描述具体的一个物体了。 比如一只猫有哪些特征,它能做哪些动作。 工程师想出了一个在代码中设置猫所有特征和动作的办法, 这就有了 class 类的概念

class File:def __init__(self):self.name = "f1"self.create_time = "today"my_file = File()
print(my_file.name)
print(my_file.create_time)
f1
today
  • 把类给实例化的时候,File 类都会触发一次__init__功能,所以这是一个功能,用于初始化一些设置。

  • 也可以修改属性值

my_file.name = "new_name"
print(my_file.name)
new_name

羊老羊讲解】这里my_file是个实例,调用的时候就初始化File(), 我们需要注意,引用的方式:实例名.属性
eg:my_file.name = “new_name”

2.2 class 功能

  • 可以像函数功能来使用。比如在 init() 里加上传入参数
class File:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timemy_file = File("my_file")
print(my_file.name)
print(my_file.create_time)
my_file
today

my_file = File("my_file")my_file就是初始化类中唯一没有默认的name

  • 返回值
class File:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timedef get_info(self):return self.name + "is created at " + self.create_timemy_file = File("my_file")
print(my_file.get_info())
my_fileis created at today

2.3 继承

当两个文件,有共性时,可以写一起。继承方式 :class 类二名(类一名)

class File:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timedef get_info(self):return self.name + "is created at" + self.create_time
class Video(File):  # 继承了 File 的属性和功能def __init__(self, name, window_size=(1080, 720)):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today") self.window_size = window_sizeclass Text(File): # 继承了 File 的属性和功能def __init__(self, name, language="zh-cn"):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today") self.language = language# 也可以在子类里复用父类功能def get_more_info(self):return self.get_info() + ", using language of " + self.language

如果子类B和父类A,都写了init方法,那么A的init方法就会被B覆盖。
想调用A的init方法需要用super去调用
super().__init__(name=name, create_time="today")

v = Video("my_video")
t = Text("my_text")
print(v.get_info())     # 调用父类的功能
print(t.create_time)    # 调用父类的属性
print(t.language)       # 调用自己的属性
print(t.get_more_info()) # 调用自己加工父类的功能
my_videois created attoday
today
zh-cn
my_textis created attoday, using language of zh-cn

2.4 私有属性和功能

  • _ 一个下划线开头:弱隐藏 不想让别人用 (别人在必要情况下还是可以用的)
  • __ 两个下划线开头:强隐藏 不让别人用
class File:def __init__(self):self.name = "f1"self.__deleted = False  # 我不让别人用这个变量self._type = "txt"      # 我不想别人使用这个变量def delete(self):self.__force_delete()def __force_delete(self):  # 我不让别人使用这个功能self.__deleted = Truereturn Truedef _soft_delete(self):     # 我不想让别人使用这个功能self.__force_delete()   # 我自己可以在内部随便调用return Truef = File()
print(f._type)      # 可以拿到值,但是这个类的作者不想让你直接这样拿到
print(f._soft_delete())  # 可以调用,但是这个类的作者不想让你直接调用# 接下来的两个实验都会报错
# f.__deleted
# f.__force_delete()

2.5 特殊方法

在这里插入图片描述

3. Module 模块

如果一个文件写所有的代码可能成千上万行,阅读起来一点也不友善, 所以我们更长是将大项目的长代码拆开成多个模块Module 模块

file.py 文件中的代码

# file.py def create_name():return "new_file.txt"

3.1 引用 module

在这里插入图片描述

  • me.py引用 file.py 文件中的create_name()
# me.pyimport file
print(file.create_name())

这里需要注意,我们引入文件file,但里面是什么不知道,所以引用时:文件名.函数名file.create_name()

  • 引入这个函数时,就不需要加文件名了create_name()(已经知道在哪了)
#导入file所有文件
from file import *
print("2", create_name())
# 引入文件下莫某个函数
from file import create_name
print(create_name())
  • 同时引入模块下多个函数
# me.pyfrom file import create_name, create_time
  • 别名
# me.pyimport file as f1

3.2 大项目的模块管理

在稍微大点的项目中,随着代码量增加,代码管理起来越来越困难。可以做个文件系统

在这里插入图片描述

# files/__init__.pyfrom .video import get_video_size # 点运行会报错的

正规的 module 中,我们常会看到一个 __init__.py 文件,这个文件其实就有点像 class 里的 def init(self), 你可以在里面写上要如何初始化你的 files 目录。也可以设定目录中个元素的关系。

  • 知识点】这里是相对路径.video

    在模块A.B.C中的代码,这里的C就相当于__init__.pyB就相当于file

    from . import D # 导入A.B.D
    from … import E # 导入A.E
    from …F import G # 导入A.F.G,… 和 F是连着的,中间没有空格

    from .video import get_video_size就是file文件夹内的video中引入get_video_size()

  • 这里导入文件的时候,初始化试将get_video_size

# me.pyfrom files import get_video_size
print(get_video_size())

虽然不知道 files/video.py里面什么内容,然在file初始化的时候 ,已经有了函数get_video_size(),就可以用了

# me.pyfrom files import create_name    # 这里会报错,因为file初始化的时候 不知道creat_name

这里会报错,因为file初始化的时候 不知道creat_name在哪,不能直接引入函数名,应该导入的是可以看见的文件名,如下:

  • 如果我们要获取到 text.py 的功能,我们得这样 import:
# me.pyimport files.text
print(files.text.create_name())# 或者这样:
from files import text
print(text.create_name())

导入文件名text,引用的时候用text.create_name()

相关内容

热门资讯

长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
不用扬鞭自奋蹄 乘势而上千帆竞... 思明区正全力向“两个进位”目标发起冲刺,努力为建设高素质高颜值现代化国际化的厦门作出“思明贡献”。(...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
好听的民谣歌曲 2021最火的... #我的年度歌单#在2021年里听过很多民谣,但是最能触及心中温柔的还是下面的几首。不听民谣的理由有很...