
正文
python打包与函数 python如何打包程序
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
qt中如何解包利用python 的struct.pack()函数打包的数据
在Python中使用struct模块打包数据和在C/C++语言中定义一个结构体(也是把多个成员打包到一块)差不多。
只要客户端告诉了你打包的数据的格式(比如:数据包的总长度、数据包中各个数据域的长度及类型,以及端序——大端还是小端),然后定义一个等价的C语言结构体,并把接收到的数据放入一个这样的结构体变量(对象)中就完成了解包工作。然后,访问结构体中的特定成员,就是访问传送过来的特定数据了。
相关问答
Q1: 急等!!python中的pack函数怎样才能将一个十六进制的字符串打包成一个高位在前的十六进制数串??
试试pythonpython打包与函数的binascii模块
import binascii
tmp = '123456789ABCDEF0'
message = binascii.unhexlify(tmp)
此模块功能很多python打包与函数,详细用法百度一下吧
Q2: 将python打包成exe
return 应该放在一个函数里面的,
将python打包成exe的程序有很多,比如py2exe、PyInstaller等等,但是到目前为止,它们对python3.1支持的都不好,所以这里我要介绍一下cx_freeze 4.2.2,它还能支持跨平台,可以在windows和linux运行。
cx_freeze的下载网址为 ,要根据已安装的python版本进行选择。比如我使用的是python3.1,所以就要下载cx_Freeze-4.2.2.win32-py3.1.msi这个文件。运行这个安装包后,相关程序就会被拷贝到python的目录下。主要在两个地方,一个是C:/Python31/Scripts,另一个是C:/Python31/Lib/site-packages/cx_Freeze
在以前版本的cx_Freeze中,是通过FreezePython.py这个脚本将py转换为exe,而在4.2.2这个版本中,FreezePython.py已经不见了,主要的工作交给了C:/Python31/Scripts下的cxfreeze.bat来完成。
使用cx_Freeze完成python打包exe主要有两种方法:
第一种,直接运行cxfreeze.bat通过:
先进入cmd命令行,进入C:/Python31/Scripts目录,然后运行cxfreeze.bat -h 就可以看到它的使用说明了。我们可以用cx_freeze自己的sample做个试验。
进入到c:/python31/scripts/下,运行
cxfreeze C:/Python31/Lib/site-packages/cx_Freeze/samples/PyQt4/PyQt4app.py --install-dir=d:/123
pytqt4app.py就会被打包成exe,并且它所用到的库文件,也被一并考到了d:/123目录下。
Q3: Python中的常用内置函数有哪些呢?
(1)Lambda函数
用于创建匿名函数,即没有名称的函数。它只是一个表达式,函数体比def简单很多。当我们需要创建一个函数来执行单个操作并且可以在一行中编写时,就可以用到匿名函数了。
Lamdba的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
利用Lamdba函数,往往可以将代码简化许多。
(2)Map函数
会将一个函数映射到一个输入列表的所有元素上,比如我们先创建了一个函数来返回一个大写的输入单词,然后将此函数应有到列表colors中的所有元素。
我们还可以使用匿名函数lamdba来配合map函数,这样可以更加精简。
(3)Reduce函数
当需要对一个列表进行一些计算并返回结果时,reduce()是个非常有用的函数。举个例子,当需要计算一个整数列表所有元素的乘积时,即可使用reduce函数实现。
它与函数的最大的区别就是,reduce()里的映射函数(function)接收两个参数,而map接收一个参数。
(4)enumerate函数
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。
它的两个参数,一个是序列、迭代器或其他支持迭代对象;另一个是下标起始位置,默认情况从0开始,也可以自定义计数器的起始编号。
(5)Zip函数
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
当我们使用zip()函数时,如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
Q4: Python嵌套函数和闭包
在Python语言中,可以在函数中定义函数。 这种在函数中嵌套定义的函数也叫内部函数。我们来看下面的代码:
上述代码中,定义了函数greet,在函数greet内部又定义了一个函数inner_func, 并调用该函数打印了一串字符。
我们可以看到,内部函数inner_func的定义和使用与普通函数基本相同。需要注意的是变量的作用域,在上述代码中,函数参数name对于全局函数greet是局部变量,对内部函数inner_func来说则是非局部变量。内部函数对于非局部变量的访问规则类似于标准的外部函数访问全局变量。
从这个例子我们还可以看到内部函数的一个作用,就是通过定义内部函数的方式将一些功能隐藏起来,防止外部直接调用。常见的场景是,在一个复杂逻辑的函数中,将一些小的任务定义成内部函数,然后由这个外层函数使用,这样可以使代码更为清晰,易于维护。这些内部函数只会在这个外层函数中使用,不能被其他函数或模块使用。
在Python语言中, 函数也是对象,它可以被创建、赋值给变量,或者作为函数的返回值。我们来看下面这个例子。
在上述代码中,在函数gen_greet内部定义了inner_func函数,并返回了一个inner_func函数对象。外部函数gen_greet返回了一个函数对象,所以像gen_greet这样的函数也叫工厂函数。
在内部函数inner_func中,使用了外部函数的传参greet_words(非局部变量),以及函数的参数name(局部变量),来打印一个字符串。
接下来,调用gen_greet("Hello")创建一个函数对象say_hello,紧接着调用say_hello("Mr. Zhang"),输出的结果为:Hello, Mr. Zhang!
同样的,调用gen_greet("Hi")创建一个函数对象say_hi,调用say_hello("Mr. Zhang"),输出的结果为:Hi,Tony!
我们可以发现,gen_greet返回的函数对象具有记忆功能,它能够把所需使用的非局部变量保存下来,用于后续被调用的时候使用。这种保存了非局部变量的函数对象被称作闭包(closure)。
那么闭包是如何实现的呢?其实并不复杂,函数对象中有一个属性__closure__,它就是在创建函数对象时用来保存这些非局部变量的。
__closure__属性是一个元组或者None类型。在上述代码中,我们可以通过下面方式查看:
函数的嵌套所实现的功能大都可以通过定义类的方式来实现,而且类是更加面向对象的代码编写方式。
嵌套函数的一个主要用途是实现函数的装饰器。我们看下面的代码:
在上述代码中,logger函数返回函数with_logging,with_logging则是打印了函数func的名称及传入的参数,然后调用func, 并将参数传递给func。其中的@wraps(func)语句用于复制函数func的名称、注释文档、参数列表等等,使得with_logging函数具有被装饰的函数func相同的属性。
代码中接下来用@logger对函数power_func进行修饰,它的作用等同于下面的代码:
可见,装饰器@符其实就是上述代码的精简写法。
通过了解了嵌套函数和闭包的工作原理,我们在使用过程中就能够更加得心应手了。
Q5: 24小时删!你不可能学不会的知识python基础
至此python打包与函数,我们已经把python最基本的数据结构讲的差不多了
不了解这个python打包与函数你可能永远不会成为python大佬(3)
不了解这个你可能永远不会成为python大佬(4)
从这节开始,你就可以写一个完整的程序结构,而不是一些零碎的小片段啦!
这节我们开始讲:
if条件语句 | for循环 | while循环 | 跳出和终止循环
[赞][赞][赞][赞][赞][赞]
01
if条件语句
顾名思义,if是“如果”的意思,它常用来判断程序在什么情况下需要做什么事,python里的条件语句形如:
1. 如果如果a成立,则执行b
if 条件a :
b
2. 如果a成立,则执行b,否则(else)执行c
if 条件a :
b
else:
c
3.如果a成立,则执行b,否则如果c成立,则执行d,如果都不成立,执行e
if 条件a :
b
elif 条件c :
d
else:
e
上文中的 仅代表4个空格缩进,如果是在notebook里写, 冒号":" 回车后会自动缩进(python程序结构的划分就是依据 严格的缩进 ,if、for等语句的缩进必须注意)
条件语句可以多种多样,像下面这样:
a= 3
b= 5
if a== 3 and b== 4 :
print( 'and用法' )
elif a== 3 or b== 4 :
print( 'or用法' )
else :
print( '比大小' )
a and b表示必须两个同时成立,a or b则只需要至少一个成立即可。
输出结果:
or 用法
小知识:短路效应
a and b中,a如果为 假 ,则python默认不执行b语句,由定义直接判定为 假
a or b中,a如果为 真 ,则默认不执行b语句,直接判定为 真 ,这就是著名的 短路效应
02
for、while循环
循环 是让一个语句 重复多次 ,为了提高程序效率。 for循环 形如:
for 变量 in 序列:
语句
可以依次循环列表中每个值,如:
for i in [ 'a' , 'b' , 'c' , 'd' ]:
print(i)
输出结果:
a b c d
上面的循环还可以写成另一种形式:
list_1=[ 'a' , 'b' , 'c' , 'd' ]
for i in range(len(list_1)):
print(list_1[i])
输出结果:
a b c d
第二种方法虽然看起来麻烦些,但实际工作中其实用的更多。
range()函数
上面程序里出现了 range() 函数,这里简单讲一下:
其中 len() 函数是 获取列表的长度 , range() 函数是一个 生成序列数 的函数。基本形式为 range(x,y,l) range(10) 代表一个 0~9 的序列, range(0,10) 与 range(10) 相同,默认步长为1,如下:
list_1=[x for x in range( 10 )] #0~9,省略起始数字,左闭右开
list_2=[x for x in range( 0 , 10 )] #0~9,起始数字为0,左闭右开
list_3=[x for x in range( 0 , 10 , 2 )] #0~9,步长为2取,左闭右开
print(list_1);print(list_2);print(list_3)
输出结果:
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
[ 0 , 2 , 4 , 6 , 8 ]
上面也是一种用 for循环生成列表 的快捷方式。
实际工作里,如果想在n个不同序列中同时循环n个量,可以像这样:
for i, n, c in zip([ 0 , 1 ], [ 'bad' , 'good' ], [ 'green' , 'red' ]):
print(i,n,c)
输出结果:
0 bad green
1 good red
其中, zip() 是一个 “打包”函数 ,将[0,1], ['bad','good'], ['green','red']变为
[(0,'bad','green'),(1,'good','red')],然后i、n、c分别进行循环。
( ps:我经常用这个方式绘图,可以一次性绘制多个参数,有奇效 )
while 意为当...成立时执行...,循环形如:
while 条件 :
语句
简单例子:
i= 0
while (i 5 ) :
print(i)
i=i+ 1
上面程序就是让i每次循环中变化,直到不满足i5时跳出循环。
for 和 while 选择哪个一般来说都行, while 更侧重 明确有中断条件 的情况, for 更侧重于 有确定长度或是循环已知的列表 ,但也可以在结构里设置中断,总的来说, for的适用面更广泛 。
03
break与continue
余下的篇幅简单讲下循环中的中断标志符: break 和 continue
break 很简单,遇到break 直接跳出当前循环 ,这个循环就废了,不再进行
continue 则是 跳过本轮的循环,后面循环继续 。
简单的例子展示一下区别:
list_1=[ 'a' , 'b' , 'c' , 'd' ]
for i in range(len(list_1)):
if (list_1[i]== 'c' ):
break
print(list_1[i])
输出结果:
a
b
换成continue:
for i in range(len(list_1)):
if (list_1[i]== 'c' ):
continue
print(list_1[i])
输出结果:
a
b
d
区别显而易见了。
这时候就很多人要问了,如果我想满足某个条件就 连续 跳出好几层循环,该咋办?如果直接用break,会出现下面这样:
for i in range( 10 ):
for j in range( 10 ):
if (j== 3 ):
break
print( 'j中断位置:' ,j)
print( 'i中断位置:' ,i)
输出结果:
j中断位置: 3
i中断位置: 9
显然break只能跳出内层循环,外部的循环仍然完整的进行了。
我们引入 break_flag标志位 来解决这个问题:
for i in range( 10 ):
break_flag = False #跳出整个循环的标志
for j in range( 10 ):
if (j== 3 ):
break_flag = True
break
if (break_flag):
break #跳出外层循环
print( 'j中断位置:' ,j)
print( 'i中断位置:' ,i)
输出结果:
j中断位置: 3
i中断位置: 0
这里,内层 break 前先将 break_flag 置为 True ,跳出内层后 if(break_flag ) 判定成立,再次执行外层的 break ,达到了连续跳多层循环的目的。
关于python打包与函数和python如何打包程序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







