Python封装高函数 python封装成函数
将下面Python代码封装成函数
Python:常用函数封装:
创新互联主要从事成都网站建设、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务平邑,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
def is_chinese(uchar):
"""判断一个unicode是否是汉字"""
if uchar = u'\u4e00' and uchar=u'\u9fa5':
return True
else:
return False
def is_number(uchar):
"""判断一个unicode是否是数字"""
if uchar = u'\u0030' and uchar=u'\u0039':
return True
else:
return False
def is_alphabet(uchar):
"""判断一个unicode是否是英文字母"""
if (uchar = u'\u0041' and uchar=u'\u005a') or (uchar = u'\u0061' and uchar=u'\u007a'):
return True
else:
return False
def is_other(uchar):
"""判断是否非汉字,数字和英文字符"""
if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
return True
else:
return False
def B2Q(uchar):
"""半角转全角"""
inside_code=ord(uchar)
if inside_code0x0020 or inside_code0x7e: #不是半角字符就返回原来的字符
return uchar
if inside_code==0x0020: #除了空格其他的全角半角的公式为:半角=全角-0xfee0
inside_code=0x3000
else:
inside_code+=0xfee0
return unichr(inside_code)
def Q2B(uchar):
"""全角转半角"""
inside_code=ord(uchar)
if inside_code==0x3000:
inside_code=0x0020
else:
inside_code-=0xfee0
if inside_code0x0020 or inside_code0x7e: #转完之后不是半角字符返回原来的字符
return uchar
return unichr(inside_code)
def stringQ2B(ustring):
"""把字符串全角转半角"""
return "".join([Q2B(uchar) for uchar in ustring])
def uniform(ustring):
"""格式化字符串,完成全角转半角,大写转小写的工作"""
return stringQ2B(ustring).lower()
def string2List(ustring):
"""将ustring按照中文,字母,数字分开"""
retList=[]
utmp=[]
for uchar in ustring:
if is_other(uchar):
if len(utmp)==0:
continue
else:
retList.append("".join(utmp))
utmp=[]
else:
utmp.append(uchar)
if len(utmp)!=0:
retList.append("".join(utmp))
return retList
如何用Python封装C语言的字符串处理函数
在C语言中,字符串处理是每天都要面对的问题。我们都知道C语言中其实并没有一种原生的字符串类型,‘字符串’在C语言里只是一种特殊的以''结尾的字符数组。因此,如何将C语言与更高层次的Python语言在‘字符串’处理这个问题上对接是一个有难度的问题。所幸有swig这种强大的工具。
如何封装一个函数,它修改参数字符串的内容
假如有这样一个C语言的函数,
!-- lang: cpp --
void FillZero(char* pc,size_t * piLen)
{
size_t i=0;
while(i++*piLen/2 )
*pc++ = '0';
*pc = 0;
*piLen = i+1;
}
这个函数的功能是把字符串变成n个0。不过我们更关注函数的形式。这样的函数,表面上看char* pc是函数的参数,可是实际上它才是函数的返回值和执行的结果。piLen这个参数既是pc的最大长度,也是新的字符串的长度。我们直接用python封装,看看运行结果。
Type "help", "copyright", "credits" or "license" for more information.
import cchar
s='123456'
cchar.FillZero(s,6)
Traceback (most recent call last):
File "stdin", line 1, in module
TypeError: in method 'FillZero', argument 2 of type 'size_t *'
结果差强人意,不是我们想要得到的结果。函数的第二个参数为size_t* 我们很难用python来表示,而且python中也不存在既是输入,也是输出的参数。
swig有一个标准库,其中有一个cstring.i文件就是用来解决C语言字符串类型的问题。
我们在.i文件中加入这样几行
!-- lang: cpp --
%include "cstring.i"
%cstring_output_withsize(char* pc,size_t* pi)
void FillZero(char* pc, size_t* pi);
然后运行看结果
Type "help", "copyright", "credits" or "license" for more information.
import cchar
cchar.FillZero(10)
'00000\x00'
s=cchar.FillZero(10)
print s
00000
我们看函数的变化。首先在python里, FillZero变成了只有一个参数的函数。然后函数的返回值变成了一个字符串。其实cstring_output_size其实是一个宏,通过这个宏的定义改变了函数的形式,直接在Python中得到我们想要的结果。
其实类似cstring_output_size的宏还有好几个,我列举一下:
cstring_output_allocate(char *s,free($1));
第一个参数是指向字符串地址的指针,第二个参数为释放空间的方法。
大家考虑这一下这样的函数:
void foo(char* s)
{
s = (char*)malloc(10);
memcpy(s,"123456789",9);
}
s这个参数表面上看是输入,实际上是函数真正的输出。 函数中真正改变的东西是chars指向的字符串的值。而且char这个类型,
python或者其他脚本语言里应该都没有对应的类型。那么我们用cstring_output_allocate将这个函数转换成另外一个形式的python或者其他脚本语言的函数。转换后的函数其实是这样的,以python为例str
foo()。
!-- lang: cpp --
%module a
%include "cstring.i"
%{
void foo(char* s);
%}
%cstring_output_allocate(char *s, free(*$1));
void foo(char *s);
在python中的调用:
!-- lang: python --
import a
a.foo()
'123456789'
cstring_output_maxsize(char *path, int maxpath);
第一个参数也是可以改变的字符串首地址,第二个参数为字符串的最大长度。在Python中调用的时候,只有maxpath这个参数,返回字符串。
cstring_output_allocate(char *s, free($1));
第一个参数为指向字符串首地址的指针,第二个参数为释放指针的方法。这个宏主要是封装一种直接在函数内部malloc空间的函数。在Python中调用时没有参数,直接返回字符串。
cstring_output_allocate_size(char *s, int slen, free(*$1));
这个相当于前面两个函数的组合。在函数内部malloc空间,然后将字符串长度通过slen返回。其实在调用的时候非常简单,没有参数,直接返回字符串。
如何处理c++的std::string
std::string是C++标准类库STL中常见的类。在平时工作中大家肯定是没少用。在python中如何封装std::string? swig提供了标准库
例如函数:
!-- lang: cpp --
string Repeat(const string s)
{
return s+s;
}
只要在swig中加入这样几行:
!-- lang: cpp --
%include "std_string.i"
using namespace std;
string Repeat(const string s);
运行结果:
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import cchar
cchar.Repeat('123')
'123123'
使用起来很方便,但需要注意的是,假如函数的参数的内容是可以被修改,就不能用这种方式封装。
例如:
!-- lang: cpp --
void repeat(string s)
{
s+=s;
}
这样的函数直接使用 'std_string.i' 就是无效的。遇到这种函数,只能用C语言封装成 void repeat(chars, int maxsize), 再用swig调用 'cstring_output_withsize' 这个宏再封装一次了。
python如何封装函数
可以定义一个类,类里定义很多函数(主要用它做什么)或直接定义函数在一个py文件中
在另一个文件中导入这个那个py包,调用类和方法
就是封装了
python 高阶函数有哪些
1、高阶函数
变量可以指向函数,函数的参数可以接收变量,那么函数可以接收另一个函数作为参数,这种函数称为高阶函数。
(1)把函数作为实参
(2)把函数作为返回值
2、系统的内置高阶函数
(1)map函数:接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回
(2)reduce函数:把一个函数作用到一个序列上,这个函数必须接收两个参数,reduce把结果和序列的下一个元素做累积计算
(3)filter函数:也接收一个函数和一个序列,和map函数不同的是,filter函数把传入的函数依次作用于每个元素,然后返回返回值是True的元素
(4)sorted函数:排序函数
把用户名按照首字母不区分大小写排序
(5)sorted()函数按照关键字排序
关键字:商品个数
(6)sorted()函数按照关键字排序,用键值来查找
(7)lambda匿名函数:有时候传参数时不需要显示自定义的函数,直接传入匿名函数更方便;冒号前面的x,y表示函数参数,匿名函数不需要担心函数名的冲突,匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用函数,匿名函数也可以作为返回值返回
3、高阶函数的应用:
(1)sorted函数:
(2)sorted函数默认是从小到大排序
4、装饰器
装饰器就是用来装饰函数的:想要增加原有函数的功能,但是不希望修改原有函数的定义,在代码运行期间动态增加功能的方式
(1)此装饰器的功能:计算函数的运行时间
import functools
@functools.wraps(f) ##保留原有函数的属性
运行结果:
(2)此装饰器的功能:用户登录认证
运行结果:
(3)此装饰器的功能:认证用户的同时,显示用户的转账金额
import inspect
inspect.getcallargs()将传的参数封装为一个字典,字典的key值是形式参数,value值是实参
(4)此装饰器的功能:确保收到的每个参数都是整数,是整数就求和,否则抛出错误
(5)此装饰器的功能:给装饰器传参数,是整数和浮点数就求和
python学习网,大量的免费python视频教程,欢迎在线学习!
python怎么读封装函数
封装其实分为两个层面,但无论哪种层面的封装,都要对外界提供好访问你内部隐藏内容的接口(接口可以理解为入口,有了这个入口,使用者无需且不能够直接访问到内部隐藏的细节,只能走接口,并且我们可以在接口的实现上附加更多的处理逻辑,从而严格控制使用者的访问)
第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种封装。print(m1.brand) #实例化对象(m1.)
print(motor_vehicle.tag) #类名(motor_vehicle.)
-------------输出结果---------注意:对于这一层面的封装(隐藏),类名.和实例名.就是访问隐藏属性的接口
第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。
Python中私有化的方法也比较简单,即在准备私有化的属性(包括方法、数据)名字前面加两个下划线即可。
文章标题:Python封装高函数 python封装成函数
分享链接:http://ybzwz.com/article/dodjosg.html