python-day07 函数基础、函数高级应用、模块

函数进阶

创建函数

def 语句

  • 标题行由 def 关键字、函数的名字,以及参数的集合(如果有的话)组成
  • def 子句的剩余部分包括了一个虽然可选但是强烈推荐的文档字串,和必需的函数体

前向引用

  • 函数不允许在函数未声明之前,对其进行引用或者调用

注意

  • 定义函数时,函数的先后顺序不重要,重要的是 函数在什么位置被调用

调用函数

  • 使用一对圆括号() 调用函数,如果没有圆括号,只是对函数的引用
  • 任何输入的参数都是必须放置在括号中

关键字参数

  • 关键字参数的概念仅仅针对函数的调用
  • 这种理念是 让调用者通过函数调用中的参数名字来区分参数
  • 这种规范允许参数不按顺序
  • 位置参数应写在关键字参数前面

 

 注意:关键字参数后面不能有位置参数

#关键字 函数名称(形參..)
def func(a,b):
    #函数体
    return a+b
#调用:函数名称()
#print(func(2,3))
def get_info(name,age=20):
    print(f'姓名:{name}  年龄:{age}')
#位置参数
get_info('刘德华',80)
get_info('刘德华')
#关键字参数
get_info(name='积极',age=33)
get_info(age=54,name='嗯能')
#多次赋值
#get_info('郭德纲',name='于前')
#get_info(age=56,'郭德纲') #关键字参数必须放在位置参数前

匿名函数

  • python 允许用 lambda 关键字创造匿名函数
  • 匿名是因为不需要以标准的 def 方式来声明
  • 一个完整的 lambda "语句"代表了一个表达式,这个表达式定义体必须和声明放在同一行

注意:匿名函数体中,只有一行代码,必须带有返回值;将匿名函数赋给变量,变量名称是一个函数名称

def func01(n1,n2):
    n1 *= 2
    n2 *= 3
    return n1+n2
#匿名函数,需要使用关键字lambda
#将匿名函数赋给变量,变量名称是一个函数名称
#匿名函数体中,只有一行代码,必须带有返回值
test = lambda n1,n2: n1+n2
# print(func01(2,3))
# print(test(2,3))
import random
def func02():
    num = random.randint(1,100)
    print(num)
    if num % 2 == 0:
        print("这个数是偶数")
    else:
        print("这个数是奇数")
#func02()

test1 = lambda n: True if n % 2 == 0 else False
print(test1(4))

变量作用域

全局变量(函数以外的变量)

  • 标识符的作用域是定义为其声明在程序里的可应用范围,也就是变量的可见性
  • 在一个模块中最高级别的变量有全局作用域
  • 全局变量的一个特征是除非被删除掉,否则他们会存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的

局部变量(函数以内的变量)

  • 局部变量只是暂时的存在,仅仅只依赖于定义他们的函数现阶段是否处于活动
  • 当一个函数调用出现时,其局部变量就进入声明它们的作用域。在那一刻,一个新的局部变量名为那个对象创建了
  • 一旦函数完成,框架被释放,变量将会离开作用域

局部变量只在函数内部起作用,定义函数名时不要和系统变量重名,否则会覆盖,不具备原本的功能

global 语句

  • 因为全局变量的名字能被局部变量给遮盖掉
  • 为了明确地引用一个已命名的全局变量,必须使用 global 语句

查找变量或函数的顺序

  • 首先在函数的内部去查找
  • 函数内部没有,然后去全局去查找,看是否定义
  • 全局也没有,最后会去内建函数中查找

什么是内建函数
在Python的手册中,名叫build-in Functions,中文可以称为内建函数。
内建函数就像dos系统的内部命令,他不依赖于外部模块,也就是说:
内建函数就是:安装好Python后就可以直接使用的函数,不需要import任何模块

生成器

Python 使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

Python有两种不同的方式提供生成器:

  • 生成器函数:

    • 常规函数定义,但是,使用 yield 语句而不是 return 语句返回结果
    • yield 语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

 注意:生成器表达式中只能存放一种数据类型,而生成器函数可以存放多种类型的数据

# 生成器函数
# return: 函数执行的终止
# yield: 表示函数执行的暂停
def func02():
    a = 1
    yield a
    b = "hello"
    yield b
    c = [1, 2]
    yield c
gen2 = func02()
print("gen2:", gen2)
# <generator object func02 at 0x7f94da357a98>
print(gen2.__next__())  # 1
print(gen2.__next__())  # hello
for item in gen2:
    print("for:", item)  # [1, 2]
# gen2.__next__()  # 报错

  • 注意事项

    • 生成器的唯一注意事项就是:生成器只能遍历一次

    • 自定义生成器函数的过程

      • 在函数内部,有很多 yield 返回中间结果;
      • 程序向函数取值时,当函数执行到第1个yield时,会暂停函数运行并返回中间结果;
      • 当主程序再次调用函数时,函数会从上次暂停的位置继续运行,当遇到第2个yield,会再次暂停运行函数并返回数据;
      • 重复以上操作,一直到函数内部的yield全部执行完成为止

模块详解

模块

基本概念

  • 模块支持从逻辑上组织 python 代码
  • 当代码量变得非常大的时候,最好把代码分成一些有组织的代码段
  • 代码片段相互间有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关但彼此独立的操作函数
  • 这些代码段是共享的,所有 python 允许 “调入” 一个模块,允许使用其他模块的属性来利用之前的工作成果,实现代码重用

作用

  • 模块可以实现代码的重用,导入模块,就可以使用模块中已经定义好的类,函数和变量,减少代码的冗余性

模块文件

  • 模块是从逻辑来组织 python 代码的方法,文件是物理层上组织模块的方法
  • 一个文件被看作是一个独立模块,一个模块也可以被看作是一个文件
  • 模块的文件名就是模块的名字加上扩展名 .py

搜索路径

  • 模块的导入需要一个叫做 “路径搜索” 的过程
  • python 在文件系统 “预定义区域” 中查找要调用的模块
  • 搜索路径在 sys.path 中定义
  • 也可以通过 PYTHONPATH 环境变量引入自定义目录

导入模块

查看模块的默认搜索路径
>>> import sys      #导入模块sys
>>> sys.path        #path, 查看python搜索模块时的默认查找路径

添加搜索路径:

[root@localhost ~]# python3
Python 3.8.12 (default, May 10 2022, 23:46:40) 
[GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
[root@localhost ~]# cd /tmp
[root@localhost tmp]# cd
[root@localhost ~]# python3
Python 3.8.12 (default, May 10 2022, 23:46:40) 
[GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib64/python38.zip', '/usr/lib64/python3.8', '/usr/lib64/python3.8/lib-dynload', '/usr/lib64/python3.8/site-packages', '/usr/lib/python3.8/site-packages']
>>> 
[root@localhost ~]# cd /tmp
[root@localhost tmp]# mkdir mylibs
[root@localhost tmp]# vim tedu.py
[root@localhost tmp]# cat tedu.py
print('haha')
[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# export PYTHONPATH=/tmp/mylibs
[root@localhost tmp]# python3
Python 3.8.12 (default, May 10 2022, 23:46:40) 
[GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/tmp/mylibs', '/usr/lib64/python38.zip', '/usr/lib64/python3.8', '/usr/lib64/python3.8/lib-dynload', '/usr/lib64/python3.8/site-packages', '/usr/lib/python3.8/site-packages']
>>> import tedu
haha

内置模块

hashlib 模块

  • hashlib 用来替换 MD5 和 sha 模块,并使他们的API一致,专门提供hash算法
  • 包括md5、sha1、sha224、sha256、sha384、sha512,使用非常简单、方便

tarfile 模块

  • tarfile模块允许创建、访问 tar 文件
  • 同时支持 gzip、bzip2 格式
import tarfile
#以gz方式创建压缩包
tar = tarfile.open('/tmp/dmeo.tar.gz',mode='w:gz')
#添加文件
tar.add('/etc/hosts',)
tar.add('/etc/security')
#关闭文件
tar.close()
#解包
tar1 = tarfile.open('/tmp/dmeo.tar.gz',mode='r')
tar1.extractall('/tmp/demo')
tar1.close()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值