python函数

1.函数作用

  • 最大化代码重用和最小化代码冗余
  • 流程的分解

2.函数基本概念

  • def创建对象并赋值给某一变量
## 创建一个函数对象并赋值给fn_namedef fn_name(args1,args2,...,argsN):    <statements>复制代码
  • def是可执行的代码
## 通过if语句判断来做定义函数,def是实时执行的if test:    def fn_name():        <statement>else:    def fn_name():        <statement>

## 分配函数对象myFn = fn_name

## 调用函数fn_name()复制代码
  • return将结果对象发送给调用者
## 函数主体一般都包含return语句def fn_name(args1,args2,...,argsN):    ...    return <value>复制代码
  • lambda创建一个对象并将结果返回
## 生成函数对象的表达形式lambda argument1, argument2,... argumentN : expression using arguments

## lambda注意点其一,lambda是表达式而不是语句其二,lambda的主体是一个单个表达式而非语句

## 定义一个正常的函数def func(x,y,z):    return x+y+z

## 使用lambda表达式f = lambda x,y,z:x+y+z

## 使用默认参数f = lambda x=1,y=2,z=3:x+y+z复制代码
  • yield向调用者发回一个结果对象并记住离开的地方

生成器函数

## 编写常规def语句并用yield语句一次返回一个结果,在每个结果之间挂起并继续他们的状态## 定义生成函数def gensquare(N):    for index in range(N):        yield index ** 2        

## 等价于以下的函数def gensquare(N):     yield 0 ** 2           ## 函数每次遇到一个yield便会向调用者发送一个返回值并挂起     ...     yield (N-1) ** 2

## yield是发送数据不是返回数据## 调用生成函数,此时的函数是可迭代,可迭代对象定义了一个__next__方法for i in gensquare(5):          print(i,end=":")        

0 : 1 : 4 : 9 : 16 :复制代码

生成器表达式

## 列表解析表达式>>> list = [x**2 for x in range(6)]     [0, 1, 4, 9, 16, 25]

## 生成器表达式类似上述的列表解析但返回的结果是一个对象而不是一个列表>>> genrator = (x**2 for x in range(6))<generator object <genexpr> at 0x1021088e0>

## 执行生成器>>> next(my_generator)0 >>> next(my_generator)1...

## 编写一个列表解析器等同于在一个list内置调用中包含一个生成器表达式以迫使其一次生成列表中的所有结果>>> my_list = list(x**2 for x in range(6))复制代码
  • global声明函数中模块级别的变量并进行赋值操作

全局变量

## 全局变量是位于模块文件内部的顶层的变量名X = 80

## 全局变量如果是在函数内被赋值的话,必须经过声明def chang_x():    ## 必须声明    global X    X = 90

## 全局变量在函数的内部不经过声明也可以被引用def reference_x():    print(X)

## 注意:不同的python文件(模块)之间不要使用『模块对象.属性名』对全局变量进行修改,最好的方式通过函数修改## a.pyX = 99def change_x(new):    global X    X= new

## b.pyimport aa.change_x(97)

## 访问全局变量的方式## test.pyvar = 99

def local():     var = 0     ## 外面声明的var与函数内没关系,当这个函数执行完毕后,var仍然是99

def glob1():     global var  ## 告知函数中var是属于全局变量,直接从全局作用域开始查找,若找不到便会到内置作用域查找,如果还找不到将报错    var += 1    

def glob2():     import dir1.module  ## dir1与test.py位于同一个目录下,module是dir1下的一个模块,var是module下的全局变量    dir1.module.var += 1

def glob3():     import sys    glob = sys.modules['module']    ## 从搜索路径中获取模块,并对该模块全局变量进行操作    glob.var += 1复制代码
  • nolocal声明将要赋值的一个封闭的函数变量,即内嵌一个函数
## 基础语法def func():    nonlocal name1, name2, ... # OK here

## nonlocal名称只能存在于嵌套的def语句中,不能出现在模块的全局作用域或def之外的内置作用域def tester(start):     state = start               ## 数据保存在tester函数对象之中    def nested(label):          ## 返回内嵌的函数对象并且携带了外部函数对象的属性,每次调用将改变外部函数对象的属性state        nonlocal state          ## 使用nonlocal声明state,state必须是在嵌套函数nested提前定义过        print(label, state)        state += 1                  return nested

>>> F = tester(0) >>> F('spam') spam 0>>> F('ham')ham 1>>> F('eggs')eggs 2复制代码
  • 函数参数是通过赋值(对象引用)传递的

    • 不可变参数通过"值"传递
    • 可变对象通过"指针"进行传递
## 参数传递是通过自动将对象赋值给本地变量名来实现的def changer(a,b):    a = 9               # a是值传递,属于当前函数的本地变量    b[-1] = "spam"      # b是可变对象通过指针传递

## 在函数内部的参数名的赋值不会影响调用者## 改变函数的可变参数的值也许会对调用者有影响def changer(a,b,c):    a = 9                   ## 本地变量的值传递不影响调用者    b[-1] = "spam"          ## 函数改变可变对象所指向的内容值    c = c[:]                ## 函数内部拷贝副本,不会对调用者影响

## 阻止可变对象在函数改变内容值- 使用拷贝- 转成不可变对象,如tuple(list)复制代码
  • 参数、返回值以及变量不需要在函数中声明
## python函数没有类型约束,可以传递或返回任意类型参数def add(a):    return a ** 2

>>> add(3)9>>> add("xiao")xiaoxiao复制代码

python赋值参数匹配顺序

  • 位置:从左至右匹配非关键字参数
def func(a,b,c):    print a,b,c

>>> func(1,2,3)1,2,3复制代码
  • 关键字参数:通过匹配变量名称分配关键字参数,与位置无关
def func(a,b,c):    print a,b,c

>>> func(c=3,a=2,b=1)2,1,3复制代码
  • 其他额外的非关键字参数分配到*name元组中
## 任意非关键字参数def func(*args):    print(args)     ## 传递进来是元组数据并赋值变量名称为args

## 调用>>> f1(29,34,4,3,12,13)29,34,4,3,12,13,复制代码
  • 其他额外的关键字参数分配到**name字典中
## 任意关键字参数def func(**args):    for key,value in args.items():        print(key +"-->" + value)

## 调用>>> f2(name="xiaoxiao",url="https://www.baidu.com")url--https://www.baidu.comname--xiaoxiao复制代码
  • 使用默认值分配给在头部未得到分配的参数
## 函数定义默认参数值## 以下函数在定义参数传递的时候就已经错误,自然调用就失败def fn(name="xiao",age):    print("the name is "+name+",and the age is "+age)

>>> fn(34)      ## 调用失败SyntaxError: non-default argument follows default argument

>>> fn(age=34)   ## 调用失败SyntaxError: non-default argument follows default argument

## 正常的定义方式是没有指定默认参数值在前,有默认参数值的定义在后def fn(age,name="xiao"):    print("the name is "+name+",and the age is "+age)

>>> fn(34)          ## 调用正常>>> fn(age=34)      ## 调用正常复制代码
python模块与包

1.模块

模块组成

  • import:使导入者以一个整体获取模块
  • from:允许客户端从一个模块中获取特定的变量名
  • imp.reload:在中止py程序中,提供一种重新载入模块文件代码的方法

模块扮演的角色

  • 代码重用
  • 系统命名空间的划分
  • 实现共享服务和数据

import在模块第一次导入时执行三个步骤

  • 找到模块文件,即搜索模块
  • 编译成位码
  • 执行模块的代码来创建所定义的对象

sys.path:即模块搜索路径

  • 程序的主目录
  • PYTHONPATH目录
  • 标准链接库目录
  • 任何.pth文件的内容

模块编写

  • import将整个模块对象赋值给一个变量名
  • from将一个或多个变量名赋值给另一个模块中同名的对象
## 相同主目录## module1.py   def check(num):    return num>0

## module2.pyimport module1module1.check(9)

## from:把模块文件中的一个或者多个变量名从中复制到当前引用的作用域内,此时无需再通过模块调用from module1 import checkcheck(9)

## from *:把模块文件中所有定义好的变量名复制到当前引用的作用域中from moudle1 import *check(9)复制代码

from与import对等性

from module import name1,name2
等效于
import module
name1 = module.name1
name2 = moudle.name2
del module复制代码

模块文件生成命名空间

  • 模块语句在首次导入时执行
  • 顶层的赋值语句会创建模块属性
  • 模块的命名空间能通过属性__dict__或dir(module)获取
  • 模块是一个独立作用域(本地变量就是全局变量)

重载模块:python内置函数reload()

  • reload会在模块当前命名空间内执行模块文件的新代码
  • 文件中顶层赋值语句会使得变量名换成新值
  • 重载会影响所有使用import读取模块的客户端
  • 重载只会对以后使用from的客户端造成影响
## 使用reload()的时候,模块是预先加载过的/main    /dir1        __init__.py        /dir2            __init__.py            dir2module.py    test.py

## main的主目录加载到搜索路径中>>> import dir1.dir2.dir2moduledir1 init.....dir2 init....dir2 module py ...

>>> reload(dir1.dir2.dir2module)    ## 重新加载dir2module,而不会重新加载dir1和dir2的初始化操作dir2 module py ...

## 重新加载dir1和dir2>>> reload(dir1) >>> reload(dir1.dir2)复制代码

2.包

包的导入

  • 每一个python模块包都必须含有__init__.py文件
  • 增加主目录到包的搜索路径中,即PYTHONPATH或者是.pth文件中
  • 模块搜索路径的项目提供平台特定的目录路径前缀,之后再在import的路径左边添加这些路径

包的执行

  • 包的初始化:导入某个目录时,会自动执行改目录下__init__.py文件中的所有程序代码
  • 模块命名空间的初始化:导入后会变成真实的嵌套对象路径
  • from 语句的行为:可以在__init__.py定义目录以from 语句形式导入时,需要导出什么
## 当前目录结构:dir0    /dir1        __init__.py        a.py        /dir2            __init__.py            b.py    /module2        __init__.py            /module3                __init__.py                b.py    test.py         dir0称为主目录(__init__.py可有可无),dir1 和 dir2 是模块包,将主目录添加到搜索路径中

## 常规导入>>> import dir1.dir2.b      ## 导入后会运行并返回一个模块对象dir1 init.....              ## dir1下的__init__.pydir2 init....               ## dir2下的__init__.pydir2 module py ...          ## dir2下的b.py

## 使用from导入>>> from dir1.dir2 import b     ##  避免每次读取时重新输入路径dir1 init.....              ## dir1下的__init__.pydir2 init....               ## dir2下的__init__.pydir2 module py ...          ## dir2下的b.py复制代码

相对包导入作用域

  • 相对导入适用于只在包内导入
  • 相对导入只是用于from语句
  • 术语含糊不清
## 可以使用from语句前面的点号(".")来指定,导入相对于外围的包,## 这样的导入只是在包内部搜索而非在搜索路径(sys.path)搜索## 目录结构dir1    dir2        __init__.py        a.py    test.py

## test.py下from .dir2 import a  ## 和test.py相同包路径下的dir2文件夹的a模块的导入复制代码

模块查找总结

  • 简单模块通过搜索sys.path路径列表上每个目录查找,从左至右
  • 包是带有一个特殊的__init__.py文件的Python模块的直接目录,可以使用A,B,C目录路径语法导入
  • 同一个包文件中,常规的import语句使用将会通过sys.paths规则搜索,而包中的导入使用from语句以及前面的点号,只是检查包目录

喜欢可以关注我个人公众号

python基础知识纵览(下)相关推荐

  1. python环境下数据操作_数据分析环境搭建和Python基础知识

    搭建数据分析环境主要包括使用anaconda管理包和环境:使用Jupyter notebook将说明文本.数学方程.代码和可视化内容全部组合到一个易于共享的文档中.Python基础知识包括关键点(数据 ...

  2. python基础知识资料-Python基础知识梳理 - 第02部分

    本文是Python基础知识的第二篇, 主要是对内置对象类型的介绍, 涉及的类型如下表. 数字类型 在Python中, 数字并不是一个真正的对象类型, 而是一组类似类型的分类, 如整数和浮点数, 复数等 ...

  3. python语法基础知识总结-Python基础知识梳理 - 第01部分

    在开始Python基础知识梳理前, 先安装下环境. 以下过程是在Linux操作系统, root用户下进行的, 主要安装了2.7版本的python, 和pip, ipython, virtualenv等 ...

  4. python基本语法规则-python基础知识——基本语法

    在python基础知识这个系列中,准备罗列出我学习python的一些基础知识,包括:基本语法 控制语句 内置数据结构 模块和函数 字符串 文件处理 面向对象 异常处理 以前写机器学习算法喜欢使用Mat ...

  5. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  6. python语言的单行注释以井号开头_推荐|零基础学习Python基础知识

    原标题:推荐|零基础学习Python基础知识 Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进. Python具有丰富和强大的库,又被称为胶水语言.能把其他 ...

  7. python的django介绍_【Python基础知识】Django框架简介

    很多初学Python的小伙伴不知道该从何开始学起,其实零基础学习的话可以先学习一些Python基础知识,等基础打牢之后再去接触更加深入的技术,接下来小编就为大家简单介绍一下有关于 Django框架内容 ...

  8. python的基础知识可以应用到哪方面-Python基础知识

    python基础 python的诞生 2002年,python 2.x 2008年,python 3.x python的命名 马戏团的名称 python简介 简单.易学 持快速开发. 跨平台. 开源. ...

  9. Python基础班---第一部分(基础)---Python基础知识---第一个Python程序

    01. 第一个 HelloPython 程序 1.1 Python 源程序的基本概念 Python 源程序就是一个特殊格式的文本文件,可以使用任意文本编辑软件做 Python 的开发 Python 程 ...

最新文章

  1. 一个学渣三次面试阿里之路
  2. 凝思操作系统启动盘制作_实用!如何快速制作U盘启动盘并且重装系统
  3. 对AI毫无了解?本文带你轻松了解AI
  4. 斗地主AI算法——第十章の被动出牌(4)
  5. vue组件在ios不渲染_VueJS:点击后渲染新组件
  6. Qt5学习笔记之bin文件合成工具四:完善功能打包程序
  7. 计数器控制的while循环(C++/python版)
  8. javascript基础(对象继承与引用)
  9. 信号完整性(SI)电源完整性(PI)学习笔记(十七)传输线的串扰(一)
  10. 这篇文章告诉你时光穿梭机特效从年轻变老制作软件
  11. 服务器挂起文件怎么删除,挂起的更改
  12. 35岁到40岁,如何突破
  13. 奇点大学人工智能专家:人造智能大脑已接近现实
  14. 维骨力Glucosamine的最关键的几点...
  15. 手误【删库】 == 跑路,不存在的 ——删瓦辛格
  16. 【学习路线】——JAVA工程师成神之路
  17. 一、HALCON学习笔记(容器液位缺陷检测)
  18. 【C语言避坑指南】学习记录
  19. Arcgis-基于tif栅格图和线矢量绘制道路形变剖面线
  20. Daily English Dictation Number Six

热门文章

  1. Linux下自动化测试环境的搭建
  2. 通过MySQL存储原理来分析排序和锁
  3. 手把手教你搭建Mac环境微信小程序的本地测试服务器
  4. 手把手教你如何实现继承
  5. 解决内网搭建本地yum仓库。
  6. 极端高温导致澳大利亚断网
  7. Java 编写程序 创建一个游戏【5、6两章的内容】【第5章】
  8. 搭建基于虚拟账号的电子邮件系统
  9. 修改SDE中自动生成的web.xml文件
  10. 让Windows XP系统快上几倍的三个绝招