Python基础——函数与模块

目录

一、函数

声明函数:

调用函数:

可变和不可变类型:

参数:

build-in函数:

作用域:

函数式编程:

二、模块

Python 的内置模块

模块搜索路径:

模块导入:

Python 的内置模块 - os

Python 的内置模块 - sys

包:


一、函数

声明函数:

def关键字加上函数的名字再跟上函数的参数列表。

调用函数:

使用 ( ) 进行调用。
没有 ( ) , 不进行调用。
一切皆是对象 ,函数也是对象

可变和不可变类型:

可变类型 :

changeme函数接收列表对象,是可变对象。调用changeme函数时就会把{1,2,3,4}加到300后面,会改变其值。
不可变类型 :

changeInt函数接收了整数对象,把整数重新赋值,调用方的值是不会发生变化的。

参数:

1.必备参数
定义:

 调用:

可以直接把实际参数直接传入,也可以先写参数名称再用赋值符号跟上参数的值。

2. 默认参数

 例题中有三种情况,总的来说就是,传入的有实际参数输出的就是传入的值,没有实际参数传入就是输出的默认值。

3. 可变参数
Python中支持可变长度的参数

 这个函数的功能是打印出必选参数a,再打印出可变长参数args,以及变长参数kwargs。

第一种只传入必选参数,a=1 args为空,键值对kwargs也是没有;

第二种是传入了必选参数a和键值对的方式参数是分配给kwargs的;

第四种就是第一个参数分配给必选参数a,其余的都分配给可变长参数args,直到遇到键值对参数分配给kwargs。
注意:看输出的内容我们可以发现,args=(),加上*后*args就是list,而不加*就相当于是个元祖。
4. 可变参数调用

 例:

 根据题中的意思:首先输出x,y,z的值,对应1,2,3,;

然后进入传参到param的for循环,可以在输出框中看到依次对应的三个参数;

最后就是传参到params的for循环,可以在输出框中看到依次对应的三组键值对。

build-in函数:

作用域:

 这个例题中全局变量和局部变量的名字相同,但是最后输出的是不同的结果。

全局变量大写首字母,局部变量全小写。
不要使用Built-in和关键字作变量/函数名。
python中print函数需要返回值,如果你在print函数中所放的函数没有返回值,那么print将会return None。

函数式编程:

概念:他会通过不断嵌套的调用函数产生你想要的结果,这种思路是通过函数的叠加产生复杂和高级的功能。在函数式编程的方式下,你所定义的函数它可以接收一个函数作为输入,也可以返回一个函数作为输出。

函数式编程 vs 面向对象编程
• First-class function(既能接收一个函数作为输入,又能返回一个函数 ),简化很多设计模式
更简单的函数 – 更好编写和维护
更容易做单元测试
更容易跨线程,跨进程,甚至跨机器执行任务
接下来来看一个例题:

这里定义了一个filter函数,可以看出能传一个函数和一个序列进去,函数的作用是通过一个函数来过滤这个序列。

 

 现在有一个函数foo:只要偶数,还有一个序列a,把它们放到filter中就可以把a中所有偶数都挑选出来。

那么在这个过程中我们需要定义一个函数foo,然后再传到filter中作为一个参数,但是可能这个函数在全局中只需要用一次,那么把它作为一个全局变量就会有点得不偿失,那么我们应该怎么做呢?

我们可以使用匿名函数来替代

 我们可以使用一个lambda关键字,函数本身没有名字是一个匿名函数。主要形式是lambda关键词后面跟上参数,在冒号之后写这个函数要完成的功能。

优势:结构体简单,函数体简短场景适用 即用即弃。
一些常见应用场景
from functools import reduce
a = [ 0 , 1 , 2 , 3 , 4 , 5 ]
filter_result = list ( filter ( lambda x: x % 2 == 0 , a))   把满足lambda函数的数都从列表中过滤出来
map_result = list ( map ( lambda x: x ** x, a))    把lambda函数施加到后面list的每一个元素上面
reduce_result = reduce( lambda a, b: a + b, a, 0 )   用于缩减序列,缩减的方式是通过lambda函数提供的功能,比如这里是求和,0是他们和的最初值。
print ( 'filter_result: %s, map_result: %s, reduce_result: %s' % (filter_result, map_result,
reduce_result))
# filter_result: [0, 2, 4], map_result: [1, 1, 4, 27, 256, 3125], reduce_result: 15
reduce(function, sequence[, initial]) -> value,function=lambda a, b: a + b, sequnce=a,intial=0
sequence连续使用function, 如果不给出initial, 则第一次调用传递sequence的两个元素, 以后把前一次调用的结果和sequence的下一个元素传递给function. 如果给出initial, 则第一次传递initial和sequence的第一个元素给function。

二、模块

Python 的内置模块

datetime是Python处理日期和时间的标准库。
collections是Python内建的一个集合模块,提供了许多有用的集合类。
Base64是一种用64个字符来表示任意二进制数据的方法。
hashlib提供了常见的摘要算法,如MD5,SHA1。
itertools提供了非常有用的用于操作迭代对象的函数。
urllib提供了一系列用于操作URL的功能
HTMLParser来非常方便地解析HTML
模块导入实例:
import  

import关键字导入一个模块,这里导入的是time模块,time模块的名字调用time方法,我们就将获取当前的时间,这个获取的是起始时间到现在的秒数,起始时间是1970年的一月一号。

import还有第二种调用方法:from.....import.....

 

from+time模块+import+time函数,就可以直接调用time函数,也可以在导入的时候取一个新名字,就要多加as。

sys.path:

 

 对于内置模块而言,是通过系统的路径来搜索的,首先从当前目录下搜索,然后再从系统环境下去搜索,再从Python的安装环境下去搜索。

模块搜索路径:

当导入一个模块,Python 解析器对模块位置的搜索顺序是:
1、当前目录。
2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由
安装过程决定的默认目录。

模块导入:

python 中,当一个 module 作为整体被执行时,moduel.__name__ 的值是 "__main__"
当一个 module 被其它 module 引用时, module.__name__ 将是module 自己的名字;
当然一个 module 被其它 module 引用时,其本身并不需要一个可执行的入口main 了。

Python 的内置模块 - os

Ø os模块,用于提供系统级别的操作
os.getcwd()
获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")
改变当前脚本工作目录;相当于shell下cd
os.curdir
返回当前目录: ('.')
os.pardir
获取当前目录的父目录字符串名:('..')
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,
依此类推
os.mkdir('dirname')
生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')
删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir
dirname
os.remove()
删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.sep
输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep
输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

Python 的内置模块 - sys

Ø sys模块提供了一系列有关Python运行环境的变量和函数
sys.argv
命令行参数List,第一个元素是程序本身路径
sys.exit(n)
退出程序,正常退出时exit(0)
sys.version
获取Python解释程序的版本信息
sys.maxint
最大的Int值
sys.path
返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform
返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

包:

假设您开发了一个包含许多模块的非常大的应用程序。随着模块数量的增长,如果将它们转储
到一个位置,就很难跟踪所有这些模块。如果它们具有相似的名称或功能,则尤其如此。你可
能希望有一种方法来分组和组织它们。
包允许使用点表示法对模块名称空间进行分层结构。与模块帮助避免全局变量名之间的冲突一
样,包也有助于避免模块名之间的冲突。
创建包非常简单,因为它利用了操作系统的分层文件结构。如下:

你只要创建了一个文件夹,你就创建了一个包,在图中pkg包中有两个模块。

注:文章是根据【蓝鲸】2021秋季全新SaaS开发实战课 里的PPT写的。

猜你喜欢

转载自blog.csdn.net/weixin_63994459/article/details/124182057