本教程直接从语言特性入手,旨在让没有编程基础的小白或者其他语言领域大佬快速上手Python,本文只介绍最基础内容,深入使用Python不在本教程范围😉
Python七天快速入门——第四天(下)
一、Python函数
1.1 初窥函数
在Python中,函数是模块化编程的关键,这里首先提供一个极为简单的函数的例子:
def Hello_World():
message=input("Please you name ;")
print(f"I'm {message}.Hello python world")
#引用函数
Hello_World()
输出结果如下:
使用"def"可以定义函数,函数名的定义与一般变量的定义方法相同,函数名后的括号可以定义变量,也叫做参数,也可以不添加变量。
1.2 实参和形参
在定义函数时,添加在函数中的参数称为形参——形式上的参数;
使用函数时,添加在引用函数名的参数称为实参——实际的参数。
可以使用如下代码理解:
def Hello_World(name):
message=name
print(f"I'm {message}.Hello python world")
#引用函数
name_message="ZhangSan"
Hello_World(name_message)
输出如下:
如上图:
标号【1】是定义函数,其中的"name"是形式上的参数,也就是形参;
标号【2】中的"name_message"是实际意义上的参数,也就是实参。
函数生效的作用就是将实参传递给形参,或者可以理解为将实参赋值给形参。
函数定义过程可以定义多个参数:
def Hello_World(name1,name2):
message1=name1
message2=name2
print(f"{message1} and {message2},hello python world")
#引用函数
name1_message="ZhangSan"
name2_message="LiSi"
Hello_World(name1_message,name2_message)
输出如下:
多个形参可以使用“,”分割。
这里给出几种调用函数的方法:
def Hello_World(name1,name2):
message1=name1
message2=name2
print(f"{message1} and {message2},hello python world")
#引用函数1
name1_message="ZhangSan"
name2_message="LiSi"
Hello_World(name1_message,name2_message)
#引用函数2
Hello_World("ZhouWu","ZhengWang")
#引用函数3
Hello_World(name1="WangErmazi",name2="ZhaoSi")
输出如下:
这里强调第三种调用函数的方式,
Hello_World(name1="WangErmazi",name2="ZhaoSi")
实参还是name1和name2,调用过程先赋值后调用函数,当然两个参数调用位置也可以互换:
Hello_World(name2="ZhaoSi",name1="WangErmazi")
1.2 函数默认值设置
函数定义时,可能会有一些参数可用可不用,例如:
sorted(reverse=True)与
sorted()
如何定义以上具有默认值类型的函数呢,可以在函数定义时,指定函数的默认值,如下:
def Hello_World(name1,name2="LiSi"):
message1=name1
message2=name2
print(f"{message1} and {message2},hello python world")
以上函数可以使用如下调用:
#引用方法1
name1_message="ZhangSan"
name2_message="wangErmazi"
Hello_World(name1_message,name2_message)
#引用方法2
Hello_World(name1_message)
第一种引用方法与一般引用函数相同,输出如下:
第二种引用方法只对第一个参数进行修改,第二个参数使用定义函数时的默认值,所以引用函数时可以不输入第二个参数,这种不输入第二个参数的形式称为隐式调用形参。
1.3函数中不同实参的传递
1.3.1 传递列表
这里注意以下两种调用的区分:
【1】修改原列表
在Python中使用函数传递列表,函数处理传递的列表也相当于处理原列表:
def Hello_World(name):
print(name)
name.append("ZhangYi")
# 定义列表
Name=['ZhangSan','LiSi']
#函数调用
Hello_World(Name)
print(Name)
函数输出如下:
【2】对列表操作,但不修改原列表
当然,如果在调用函数中不需要更改原函数,可以在调用函数时创建列表副本,示例如下:
def Hello_World(name):
print(name)
name.append("ZhangYi")
print(name)
Name=['ZhangSan','LiSi']
Hello_World(Name[:])#创建列表副本
print(Name)
输出如下:
函数调用因该尽可能避免创建副本的情况,因为这样会将大量的效率应用在创建副本过程,会大大降低程序执行的效果
1.3.2 传递任意数量的实参
我们一般会遇到需要调用多个参数情况,如果频繁的输入函数调用,这显然时很繁琐的。在Python中提供了可以传递任意数量实参的方法。
在定义函数时可以进行如下定义:
def Hello_World(*name):
print(name)
Hello_World('ZhangSan')
Hello_World('ZhangSan','LiSi')
使用*name的形式可以传入多个实参。
输出如下:
形参名*name 中的星号让 Python 创建一个名为 name 的空元组,并将收到的所有值都封装到这个元组中。函数体内的函数调用 print()通过生成输出,证明 Python 能够处理使用一个值来调用函数的情形,也能处理使用两个值来调用函数的情形。它以类似的方式处理不同的调用。
注意,Python 将实参封装到一个元组中,即便函数只收到一个值。
【1】不同类型的形参定义
我们使用函数时,也会遇到需要接受不同类型的实参的函数,这种情况下必须在函数定义中将接纳任意数量实参的形参放在最后。Python 先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
读者可以看以下示例加以理解:
def Hello_World(name1,*name2):
print(name1)
print(name2)
Hello_World('ZhangSan','LiSi','ZhouWu','ZhengWang')
输出如下:
基于上述函数定义,Python 将收到的第一个值赋给形参 name1,并将其他所有值都存储在元组name2 中。
【2】任意数量的不同类型的形参定义
有时候,函数需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键值对——调用语句提供了多少就接受多少,这种方式其实就是是创建一个字典。
示例如下:
def Student_Message(name,age,**message):
message['Name']=name
message['Age']=age
print(message)
Student_Message('ZhangSan',20,location='Liaoning',field='physics')
输出如下:
1.4函数返回值
函数并非总是直接显示输出,它还可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。在函数中,可使用 return 语句将值返回到调用函数的代码行。
【1】返回简单值
简单的返回值直接使用return即可, 示例如下:
def Hello_World(name1,name2):
message=f"{name1} and {name2},hello world"
return message
print(Hello_World('zhangsan','lisi'))
输出结果如下:
也可以把return后的变量进行一些简单的处理:
def Hello_World(name1,name2):
message=f"{name1} and {name2},hello world"
return message.title()
print(Hello_World('zhangsan','lisi'))
输出结果如下:
【2】返回字典
在 1.3.2 传递任意数量的实参中的【2】,代码可以做如下修改,直接返回字典:
def Student_Message(name,age,**message):
message['Name']=name
message['Age']=age
return message
ZhangSan=Student_Message('ZhangSan',20,location='Liaoning',field='physics')
print(ZhangSan)
输出如下:
1.5 函数导入与储存
函数的应用具有很多优点,一个突出的优点就是可以将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。当然,我们也可以将函数存储在称为模块的独立文件中,再将模块导入到主程序中。“import” 语句允许在当前运行的程序文件中使用模块中的代码。
1.5.1 使用import 创建与导入函数模块
【1】导入整个文件
在pycharm中可以新建一个.py文件,然后使用import导入文件,
在HelloWorld.py文件中输入以下代码,
def Hello_World(name1,name2):
message=f"{name1} and {name2},hello world"
return message.title()
同路径下可以建立执行的main.py文件,输入以下代码:
import HelloWorld
message=HelloWorld.Hello_World('zhangsan','lisi')
print(message)
输出结果如下:
【2】导入具体的函数
可以使用如下的方法导入具体的函数:
from HelloWorld import Hello_World
message=Hello_World('zhangsan','lisi')
print(message)
可以用这种方式导入某个文件中的单个函数:
from 文件名 import 函数名
当然也可以导入多个函数:
from 文件名 import 函数名1,函数名2,函数名3
1.5.2 使用 as 设置别名
【1】给函数起别名
有时导入的函数名称较为复杂,我们可以对导入的函数重新命名:
from HelloWorld import Hello_World as Hello
message=Hello('zhangsan','lisi')
print(message)
使用以下方式可以使用as对函数起别名:
from 文件名 import 函数名 as 函数别名
【2】给文件起别名
有时导入的文件名称较为复杂,我们可以对导入的文件重新命名:
import HelloWorld as Hello
message=Hello.Hello_World('zhangsan','lisi')
print(message)
使用以下方式可以使用as对文件起别名:
import 文件名 as 文件别名
1.6 函数全部导入与注意
导入文件中的所有函数可以使用如下格式的操作:
from 文件名 import *
可以导入文件中的所有函数,但是这并不是推荐的做法因为如果模块中有函数的名称与当前项目中使用的名称相同,可能导致意想不到的结果:Python 可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。
最佳的做法是,要么只导入需要使用的函数,要么导入整个模块并使用句点表示法。这让代码更清晰,更容易阅读和理解。