百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python实用案例编程入门:第五章 函数和类

off999 2024-09-21 20:49 21 浏览 0 评论

本章的主题为函数和类,在编程中比较重要的概念。

5.1 函数

Python语言提供了函数的概念,就是给代码块赋予一个名字,然后所有需要使用该代码块的地方都直接调用该代码的名字即可,就叫做函数,该名字叫函数名。这样,我们就可以通过函数名来表示该代码块所提供的功能,在任何使用的地方只需要调用该函数名即可,而不用每个使用的地方都重复该代码块。及便于重复使用已有代码,也方便调试和修改,比如我们希望修改该功能块,只需要修改该函数内的代码即可,而无需修改所有的被使用的地方。

同时呢,由于函数的使用,主程序就没有那么多代码,使主程序的结构清晰易于理解。

5.1.1 函数的定义

函数定义时需要指定一个能够描述所要做的事情的名称,Python中约定使用小写字母加下划线的形式,函数的定义如下所示。

def say_hi():
"""say hi"""
	print("你好")

上面的代码片段是一个函数定义的示例,def后面跟着函数名,函数名后面必须是圆括号,圆括号后面是冒号,然后紧跟着函数的代码块。函数名称部分可以自定定义,一般采用小写字母加下划线的方式。在使用函数的时候,可以直接用函数名加圆括号即可。

say_hi()
>>>你好

该函数的定义没有参数,我们可以定义有入参的函数,让函数的功能更灵活。

def say_hi(language):
"""say hi"""
	print("你好 " + language)

say_hi("Python")
say_hi("C++")
>>>你好 Python
>>>你好 C++

从上面的例子可以看出,我们可以通过say_hi()函数去对不同的语言问好,但不需要对每个语言都编写相同的代码块。

函数除了让我们代码块更容易复用之外,也能够让调用函数的主函数更加的简洁,易于阅读和修改。程序的可阅读性是非常重要的,对于编程来说,调试代码花的时间可能更多,但在调试过程中需要清楚的知道程序的逻辑和结构,而函数使代码更具模块话,用一个函数名就代替了一个功能块的好几行代码,甚至几十行,因此函数对于编程来说非常有用。

5.1.2 函数的参数及默认值

如上节所示,函数支持参数传递,这就让函数可以灵活的接收来自调用者传递的数据。

在将列表作为参数有点特殊,函数可以修改列表的内容,从而使用调用者的数据也被修改了。而其他类型的数据,函数仅仅是将数值传递给函数使用,并不会修改调用者持有的数据内容。因此,列表显得比较特殊,但我们也可以将列表作为参数传递给函数,同时也不会修改调用者持有的列表值。列表有一个称之为拷贝的方法,可以将列表的内容复制一份作为参数进行传递,比如list[:]或者copy()方法。

example_language = ['C++', 'Python']

def say_hi(languages):
"""say hi"""
  for language in languages:
  	print("你好 " + language)

languages.append("Java")

say_hi(example_language)
print(example_language)
>>>你好 C++
>>>你好 Python
>>> ['C++', 'Python', 'Java']

有上面的代码我们可以知道,函数say_hi()修改了example_languages的值,而这可能不是我们所期望的。如上面所述,我们可以通过相应的方法来解决该问题。

example_language = ['C++', 'Python']

def say_hi(languages):
"""say hi"""
  languages.append("Java")
  for language in languages:
  	print("你好 " + language)

say_hi(example_language[:])
print(example_language)
>>>你好 C++
>>>你好 Python
>>>你好 Java
>>>['C++', 'Python']

从运行的结果来看,函数并没有修改调用者的数据,而只是函数自己内部的参数值被修改了,再看看另一种方法。

example_language = ['C++', 'Python']
def say_hi(languages):
"""say hi"""
  languages.append("Java")
  for language in languages:
  	print("你好 " + language)

say_hi(example_language.copy())
print(example_language)
>>>你好 C++
>>>你好 Python
>>>你好 Java
>>>['C++', 'Python']

函数也可以接收任意数量的参数,比如像下面代码所示。

def say_hi(*languages):
"""say hi"""
  for language in languages:
  	print("你好 " + language)

say_hi('C++', 'Python')
>>>你好 C++
>>>你好 Python
def say_hi(*languages):
"""say hi"""
  for language in languages:
  print("你好 " + language)

say_hi('C++', 'Python', 'Java')
>>>你好 C++
>>>你好 Python
>>>你好 Java

从上面代码可以看出,无论入参有多少个,函数都可以通过for循环迭代逐个处理。我们再看另一个可以接收任意数量键值对的实现。

接收任意数量的键值对,代码示例如下。

def say_hi(**languages):
"""say hi"""
    for language,author in languages.items():
        print("你好 " + author + " and thanks your " + language)

say_hi(Cplusplus='Bjame Stroustrup', Python='Guido', Java='James')
>>>你好 Bjame Stroustrup and thanks your Cplusplus
>>>你好 Guido and thanks your Python
>>>你好 James and thanks your Java

5.1.3 函数的返回值

函数的调用者可以传递数据给函数,同样函数也可以返回数据给调用者。而返回给调用者的数据,我们称之为返回值,这样函数的功能就很全面了。既可以接受来自调用者的数据,也可以返回数据给调用者,从而完成信息交互。

下面的代码展示了函数如何返回值,及调用者如何获取函数返回值。

def say_hi(**languages):
"""say hi"""
    for language,author in languages.items():
        print("你好 " + author + " and thanks your " + language)

 eturn "say hi to all languages successfully"

value = say_hi(Cplusplus='Bjame Stroustrup', Python='Guido', Java='James')
print(value)
>>>你好 Bjame Stroustrup and thanks your Cplusplus
>>>你好 Guido and thanks your Python
>>>你好 James and thanks your Java
>>>say hi to all languages successfully

如程序执行结果所示,函数成功的执行完后,将一个字符串作为返回值return给调用者,而调用者将该返回值存入一个变量value中。通过print函数进行打印,可以看到我们得到就是say_hi()函数的返回的值。

5.2 类

介绍完函数,我们再看看另一个更高级的内容,类。如我们在函数一节所提到的,类也是另一个将代码进行封装的技术,但类比函数更高级,类可以将数据与函数封装在一起。

5.2.1 类的定义

类是一个面向对象编程的概念,我们的程序需要模拟现实世界。而类就是用来模拟现实对象的技术基础,可以将现实中的所有事务用一个类的表示。在一个类的定义中,我们将其中函数称为方法,而将其中的数据称为属性,通过方法进行获取和修改属性,下面来看看一个简单的类定义。

class FirstClass:
    sex = '女性'

def set_sex(self, value):
    self.sex = value

def get_sex(self):
    return self.sex

在上面的类定义中,用一个变量sex保存性别。同时,定义了两个函数分别用于修改性别和获取性别。但需要注意,类中定义的函数的第一个参数必须为self,而操作具体属性时也必须用self.来进行访问,类似于C++程序中this指针。

5.2.2 类的属性

如上面类的定义中所提及,可以在类定义是定义属性。当然,也可以在类的方法中去通过self定义属性。如下代码片段中,我们在set_sex()的方法中通过self.age定义了一个存储年龄的属性。

class FirstClass:
sex = '女性'

def set_sex(self, sex, age):
self.sex = sex
self.age = age

def get_sex(self):
return self.sex

def get_age(self):
return self.age

有了类的定义,我们试着使用该类,下面的代码中我们定义了类的对象first_obj,然后获取默认性别为女性。紧接着,我们通过方法set_sex()修改了性别和年龄,再通过方法get_sex()和get_age()获取了性别和年龄。

first_obj = FirstClass()
sex_value = first_obj.get_sex()
print(sex_value)
first_obj.set_sex('男性', 23)
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value, age_value)
>>>女性
>>>男性 23

通过上面的代码,我们可以看到都是在通过类的方法进行访问和修改属性。

5.2.3 类的方法

在面向对象编程中,我们只希望给用户提供必要的访问接口,也就是方法,从而隐藏具体实现和数据。我们还是通过上面的类定义来说明方法的定义和使用,定义了三个方法,set_sex()用于设置性别和年龄,get_sex()用于获取性别,而get_age()用于获取年龄,但如果用户想要单独修改年龄怎么办呢?似乎没有现成的方法,那么我们是否可以将set_sex()修改为只设置性别,再增加一个新方法去专门设置年龄呢?答案是肯定的,我们来看看下面的代码。

class FirstClass:
sex = '女性'
age = 18
def set_sex(self, sex):
self.sex = sex

def set_age(self, age):
self.age = age

def get_sex(self):
return self.sex

def get_age(self):
return self.age

上面的代码我们重新定义之前的类,新增了set_age()方法,从而使类的方法定义更加清晰简单,一个函数只做一件事。

first_obj = FirstClass()
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value)
first_obj.set_sex('男性')
first_obj.set_age(23)
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value, age_value)
>>>女性
>>>男性 23

从程序的执行结果来看,我们 并未修改程序的执行效果。

5.3 模块

Python提供了模块的机制,可以让我们将函数或者类单独存入一个Python文件中,从而隐藏具体实现。而使用者无需关注具体实现,只是简单的调用函数或者使用类即可,这样我们就可以将该模块文件共享给其他任何人使用,或者很容易的使用在自己的其他程序中。

我们只需要通过import 相应的模块文件名即可,该文件必须是Python文件,导入时只需要导入文件名,不需要加py文件后缀。

我们这里将前面的函数和类存入一个Python文件中作为模块,然后进行导入使用。

该文件名为try_module.py,其内容如下所示。

class FirstClass:
sex = '女性'
age = 18
def set_sex(self, sex):
self.sex = sex

def set_age(self, age):
self.age = age

def get_sex(self):
return self.sex

def get_age(self):
return self.age

def say_hi(**languages):
"""say hi"""
for language,author in languages.items():
print("你好 " + author + " and thanks your " + language)

return "say hi to all languages successfully"
在我们的程序中只需要import这个文件,便可以使用其中的类及函数。
import try_module

first_obj = try_module.FirstClass()
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value)
first_obj.set_sex('男性')
first_obj.set_age(23)
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value, age_value)

value = try_module.say_hi(Cplusplus='Bjame Stroustrup', Python='Guido', Java='James')
print(value)

程序执行效果如下,和不用模块时完全一样,但这里简化了程序实现,其他使用者同样只需要导入该模块文件即可。

>>>女性
>>>男性 23
>>>你好 Bjame Stroustrup and thanks your Cplusplus
>>>你好 Guido and thanks your Python
>>>你好 James and thanks your Java
>>>say hi to all languages successfully

除了直接使用import导入所有的内容,还可以通过from try_module import say_hi只导入函数say_hi()。也可以用import try_module as td给模块一个别名,或者通过from try_module import *导入所有的内容,但使用时不需要在前面加模块名。

这里给一段代码示例。

from try_module import say_hi

value = say_hi(Cplusplus='Bjame Stroustrup', Python='Guido', Java='James')
print(value)

import try_module as td

first_obj = td.FirstClass()
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value)
first_obj.set_sex('男性')
first_obj.set_age(23)
sex_value = first_obj.get_sex()
age_value = first_obj.get_age()
print(sex_value, age_value)

5.4 本章小结

本章我们学习了如何编写函数,将代码块以函数的形式进行定义和使用。同时也介绍了如何定义类,以及类的属性的定义,类的方法的定义及使用,从而让我们有多种手段进行代码封装和更好的复用。

最后介绍了一个Python中比较中的概念,模块。通过模块我们可以将类和函数通过文件进行管理及复用,从而便于使用。模块是Python的一个非常重要的概念,这里仅做了简单的介绍,读者可以通过其他相关资料进行学习理解。

相关推荐

python入门到脱坑经典案例—清空列表

在Python中,清空列表是一个基础但重要的操作。clear()方法是最直接的方式,但还有其他方法也可以实现相同效果。以下是详细说明:1.使用clear()方法(Python3.3+推荐)...

python中元组,列表,字典,集合删除项目方式的归纳

九三,君子终日乾乾,夕惕若,厉无咎。在使用python过程中会经常遇到这四种集合数据类型,今天就对这四种集合数据类型中删除项目的操作做个总结性的归纳。列表(List)是一种有序和可更改的集合。允许重复...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

数据结构与算法——链式存储(链表)的插入及删除,

持续分享嵌入式技术,操作系统,算法,c语言/python等,欢迎小友关注支持上篇文章我们讲述了链表的基本概念及一些查找遍历的方法,本篇我们主要将一下链表的插入删除操作,以及采用堆栈方式如何创建链表。链...

Python自动化:openpyxl写入数据,插入删除行列等基础操作

importopenpyxlwb=openpyxl.load_workbook("example1.xlsx")sh=wb['Sheet1']写入数据#...

在Linux下软件的安装与卸载(linux里的程序的安装与卸载命令)

通过apt安装/协助软件apt是AdvancedPackagingTool,是Linux下的一款安装包管理工具可以在终端中方便的安装/卸载/更新软件包命令使用格式:安装软件:sudoapt...

Python 批量卸载关联包 pip-autoremove

pip工具在安装扩展包的时候会自动安装依赖的关联包,但是卸载时只删除单个包,无法卸载关联的包。pip-autoremove就是为了解决卸载关联包的问题。安装方法通过下面的命令安装:pipinsta...

用Python在Word文档中插入和删除文本框

在当今自动化办公需求日益增长的背景下,通过编程手段动态管理Word文档中的文本框元素已成为提升工作效率的关键技术路径。文本框作为文档排版中灵活的内容容器,既能承载多模态信息(如文字、图像),又可实现独...

Python 从列表中删除值的多种实用方法详解

#Python从列表中删除值的多种实用方法详解在Python编程中,列表(List)是一种常用的数据结构,具有动态可变的特性。当我们需要从列表中删除元素时,根据不同的场景(如按值删除、按索引删除、...

Python 中的前缀删除操作全指南(python删除前导0)

1.字符串前缀删除1.1使用内置方法Python提供了几种内置方法来处理字符串前缀的删除:#1.使用removeprefix()方法(Python3.9+)text="...

每天学点Python知识:如何删除空白

在Python中,删除空白可以分为几种不同的情况,常见的是针对字符串或列表中空白字符的处理。一、删除字符串中的空白1.删除字符串两端的空白(空格、\t、\n等)使用.strip()方法:s...

Linux系统自带Python2&yum的卸载及重装

写在前面事情的起因是我昨天在测试Linux安装Python3的shell脚本时,需要卸载Python3重新安装一遍。但是通过如下命令卸载python3时,少写了个3,不小心将系统自带的python2也...

如何使用Python将多个excel文件数据快速汇总?

在数据分析和处理的过程中,Excel文件是我们经常会遇到的数据格式之一。本文将通过一个具体的示例,展示如何使用Python和Pandas库来读取、合并和处理多个Excel文件的数据,并最终生成一个包含...

【第三弹】用Python实现Excel的vlookup功能

今天继续用pandas实现Excel的vlookup功能,假设我们的2个表长成这样:我们希望把Sheet2的部门匹在Sheet1的最后一列。话不多说,先上代码:importpandasaspd...

python中pandas读取excel单列及连续多列数据

案例:想获取test.xls中C列、H列以后(当H列后列数未知时)的所有数据。importpandasaspdfile_name=r'D:\test.xls'#表格绝对...

取消回复欢迎 发表评论: