【Python】[03]函数模块
注释代码
在Python中,常用的注释技术是使用一个三重引号来建立多行注释,如果使用了一个三重引号,而没有将它赋值给一个变量,三重引号之间的所有内容都被认为是一个注释。
如果在一行的任意位置加了“#”符号,从这一点直到当前行末尾的所有内容都是注释,但是如果“#”出现在三重引号之间,那么“#”就只是注释内容的一部分。
接下来,发布Python代码到PYPI
首先,为模块创建一个文件夹命名为nester,将上个博客中最后保存的nester.py文件复制到这个文件夹中,然后在文件夹中再创建一个setup.py文件,setup.py文件的代码如下:
注意:setup.py中的代码一定要是这样的,注意空格和缩进,本人调试好久才通过😭
构建发布
书上的这个地方,有句话说:“在nester文件夹中打开一个终端窗口”,让我很困扰,然后查了下,有两种方法可以实现“打开一个终端窗口”的操作:
方法1、在“运行”中输入cmd,然后输入cd+空格+nester文件所在目录,回车
方法2、在nester文件夹中,使用shift+鼠标右键调出命令窗口
这两种方法都可以成功打开一个终端窗口,然后就开始正式构建发布
在终端窗口中输入:python setup.pu sdist
将发布安装到本地副本
书上说,在终端窗口中,键入如下命令:sudo python setup.py install,但是我输入sudo报出无法识别,去掉sudo就好了
(PS:这里报了一个SyntaxError,是我的nester.py文件写的有问题,后来已修改,请忽略不计)
安装后我的的文件夹中多了几个文件
将模块构建发布并安装到本地后,就可以在程序中导入该模块
很遗憾的是,并没有得到我想要的结果,报了个错给我。接下来就来聊聊这个报错吧
命名空间
主python程序中(包括IDLE shell)的代码与一个名为__main__(前后包含两个下划线)的命名空间关联。将代码放在其单独的模块中时,python会自动创建一个与模块同名的命名空间。(书上原话)
所以不能简单地通过print_lol(cast)调用这个函数,而是需要限定nester.print_lol(cast)
命名空间限定的格式:
模块名.print(要处理的列表)
当使用一个普通的import nester,这会指示Python解释器允许你使用命名空间限定来访问nester函数。如果使用from nester import print_lol,会把指定的函数(这里就是print_lol)增加到当前命名空间来,这样一来,就不用再使用命名空间限定。
不过需要注意的是,如果当前的命名空间中已经定义了一个名为print_lol的函数,这个特定import语句会用导入的函数覆盖你当前命名空间中自己定义的函数。
注册PYPI网站
首先访问PYPI网站:https://pypi.org/,register一个PYPI ID,然后在注册时提交的email中,点击确认链接确认注册即可。
注册成功后,再经过两个步骤,就可以网PYPI社区上传代码。
步骤一:再次注册PYPI
在nester文件夹下,打开命令行窗口,输入 python setup.py register,然后选择use your existing login。输入用户名和密码
步骤二:向PYPI上传发布
继续在命令行窗口中输入python setup.py sdist upload,确认上传成功后,你的发布已经成为PYPI的一部分了。
认识和学习range()BIF
range()返回一个迭代器,根据需要生成一个指定范围的数字。例如:
所以range(4)是指生成直到4但不包含4的数字。
这个BIF可以满足条件为:在nester打印嵌套列表的基础上,每遇到嵌套列表时,就缩进显示。
修改代码如下所示:
其中print("\t",end="")为打印一个tab制表符。
但是。。。报错了。。。(流泪中...)
有两个问题,一个是回调函数时,参数不对,现在已经有两个参数了
另一个问题是,缩进level一直是个定值,都没有变,遇到内嵌套多个列表时,就不会再继续缩进了。改良版如下:
可以了~完美~发布到PYPI上去之后,问题又来了
原来import nester的那些功能,现在都报错了。。。下一个知识点
使用可选参数
讲一个函数的必要参数变成可选参数,需要为这个参数提供一个缺省值,如果没有提供参考值,就会使用这个缺省值,如果提供了参考值,则会使用这个值而不是缺省值。其实关键在于,参数的缺省值实际上使得这个参数成为可选参数。
为了向函数提供一个缺省值,需要在参数名后面指定这个缺省值。即:
将修改为
这样level就变成了一个可选的参数。
定义了函数的缺省值之后,就可以采用多种不同的方式调用这个函数:
加参考值的方法:nester.print_lol(list,2)
不加参考值的方法:nester.print_lol(list)
两种方法,都能进行缩进显示。
但是,原来的顶行显示的,不缩进的功能丢失了
要给函数增加第三个参数了。。。命名为indent
这个参数用来控制是否打开缩进的功能。默认不打开缩进,即indent=false,代码如下:
def print_lol(list,indent=False,level=0):
for each_item in list:
if isinstance(each_item,list):
print_lol(each_item,indent,level+1)
else:
if indent:
for level_tab in range(level):
print("\t",end="")
else:
print(each_item)
comics=["夏目","狐妖",["未闻花名","你的名字",["大鱼海棠","虫师"]]]
OK,经过几天的摸索,终于初见雏形,很开心。
今天是剁手节&光棍节,我却在公司完成我的这篇博客,无敌的无聊是多么强大。
祝广大单身狗以及我自己节日快乐 !