python入门知识纵览
2021-03-27 21:24
标签:目录结构 文件中 文件 函数变量 生成器 属性 lte mod 搜索路径 1.函数作用 2.函数基本概念 生成器函数 生成器表达式 全局变量 python赋值参数匹配顺序 1.模块 模块组成 模块扮演的角色 import在模块第一次导入时执行三个步骤 sys.path:即模块搜索路径 模块编写 from与import对等性 模块文件生成命名空间 重载模块:python内置函数reload() 2.包 包的导入 包的执行 相对包导入作用域 模块查找总结 python入门知识纵览 标签:目录结构 文件中 文件 函数变量 生成器 属性 lte mod 搜索路径 原文地址:https://www.cnblogs.com/Mrzhangzong/p/13652838.html
python函数
## 创建一个函数对象并赋值给fn_name
def fn_name(args1,args2,...,argsN):
## 通过if语句判断来做定义函数,def是实时执行的
if test:
def fn_name():
else:
def fn_name():
## 分配函数对象
myFn = fn_name
## 调用函数
fn_name()复制代码
## 函数主体一般都包含return语句
def fn_name(args1,args2,...,argsN):
...
return
## 生成函数对象的表达形式
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复制代码
## 编写常规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))
## 执行生成器
>>> next(my_generator)
0
>>> next(my_generator)
1
...
## 编写一个列表解析器等同于在一个list内置调用中包含一个生成器表达式以迫使其一次生成列表中的所有结果
>>> my_list = list(x**2 for x in range(6))复制代码
## 全局变量是位于模块文件内部的顶层的变量名
X = 80
## 全局变量如果是在函数内被赋值的话,必须经过声明
def chang_x():
## 必须声明
global X
X = 90
## 全局变量在函数的内部不经过声明也可以被引用
def reference_x():
print(X)
## 注意:不同的python文件(模块)之间不要使用『模块对象.属性名』对全局变量进行修改,最好的方式通过函数修改
## a.py
X = 99
def change_x(new):
global X
X= new
## b.py
import a
a.change_x(97)
## 访问全局变量的方式
## test.py
var = 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复制代码
## 基础语法
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复制代码
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复制代码
## 任意非关键字参数
def func(*args):
print(args) ## 传递进来是元组数据并赋值变量名称为args
## 调用
>>> f1(29,34,4,3,12,13)
29,34,4,3,12,13,复制代码
## 任意关键字参数
def func(**args):
for key,value in args.items():
print(key +"-->" + value)
## 调用
>>> f2(name="xiaoxiao",url="https://www.baidu.com")
url--https://www.baidu.com
name--xiaoxiao复制代码
如果你有不清楚的可以进我的Python解答交流群:1148633274相互讨论学习
## 函数定义默认参数值
## 以下函数在定义参数传递的时候就已经错误,自然调用就失败
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模块与包
## 相同主目录
## module1.py
def check(num):
return num>0
## module2.py
import module1
module1.check(9)
## from:把模块文件中的一个或者多个变量名从中复制到当前引用的作用域内,此时无需再通过模块调用
from module1 import check
check(9)
## from *:把模块文件中所有定义好的变量名复制到当前引用的作用域中
from moudle1 import *
check(9)复制代码
from module import name1,name2
等效于
import module
name1 = module.name1
name2 = moudle.name2
del module复制代码
__dict__
或dir(module)获取
## 使用reload()的时候,模块是预先加载过的
/main
/dir1
__init__.py
/dir2
__init__.py
dir2module.py
test.py
## main的主目录加载到搜索路径中
>>> import dir1.dir2.dir2module
dir1 init.....
dir2 init....
dir2 module py ...
>>> reload(dir1.dir2.dir2module) ## 重新加载dir2module,而不会重新加载dir1和dir2的初始化操作
dir2 module py ...
## 重新加载dir1和dir2
>>> reload(dir1)
>>> reload(dir1.dir2)复制代码
__init__.py
文件
__init__.py
文件中的所有程序代码__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__.py
dir2 init.... ## dir2下的__init__.py
dir2 module py ... ## dir2下的b.py
## 使用from导入
>>> from dir1.dir2 import b ## 避免每次读取时重新输入路径
dir1 init..... ## dir1下的__init__.py
dir2 init.... ## dir2下的__init__.py
dir2 module py ... ## dir2下的b.py复制代码
## 可以使用from语句前面的点号(".")来指定,导入相对于外围的包,
## 这样的导入只是在包内部搜索而非在搜索路径(sys.path)搜索
## 目录结构
dir1
dir2
__init__.py
a.py
test.py
## test.py下
from .dir2 import a ## 和test.py相同包路径下的dir2文件夹的a模块的导入复制代码
__init__.py
文件的Python模块的直接目录,可以使用A,B,C目录路径语法导入
---------本文来源于网络加上自己的见解,如有侵权,请联系我删除