• 关于 python 在+= 的搜索结果

回答

闭包——装饰器的本质也是闭包“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。“闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称”。(1)第一种形式——直接调用def Maker(name):num=100def func1(weight,height,age):weight+=1height+=1age+=1print(name,weight,height,age)func1(100,200,300) #在内部就直接调用“内部函数”Maker('feifei') #调用外部函数,输出 feifei 101 201 301(2)第二种形式——返回函数名称def Maker(name):num=100def func1(weight,height,age):weight+=1height+=1age+=1print(name,weight,height,age)return func1 #此处不直接调用,而是返回函数名称(Python中一切皆对象)maker=Maker('feifei') #调用包装器maker(100,200,300) #调用内部函数(3)“闭包”的作用——保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下。ef Maker(step): #包装器num=1def fun1(): #内部函数nonlocal num #nonlocal关键字的作用和前面的local是一样的,如果不使用该关键字,则不能再内部函数改变“外部变量”的值num=num+step #改变外部变量的值(如果只是访问外部变量,则不需要适用nonlocal)print(num)return fun1 ===================================== j=1func2=Maker(3) #调用外部包装器while(j<5):func2() #调用内部函数4次 输出的结果是 4、7、10、13j+=1从上面的例子可以看出,外部装饰器函数的局部变量num=1、以及调用装饰器Maker(3)时候传入的参数step=3都被记忆了下来,所以才有1+3=4、4+3=7、7+3=10、10+3=13.从这里可以看出,Maker函数虽然调用了,但是它的局部变量信息却被保存了下来,这就是“闭包”的最大的作用——保存局部信息不被销毁。

半指温柔乐 2019-12-02 01:09:46 0 浏览量 回答数 0

问题

python 如何 实现 mqtt 接入阿里

数字小溪 2019-12-01 19:40:35 6028 浏览量 回答数 2

问题

在PHP或NodeJS中实现Python编码代码

一码平川MACHEL 2019-12-01 19:31:19 660 浏览量 回答数 1

新用户福利专场,云服务器ECS低至102元/年

新用户专场,1核2G 102元/年起,2核4G 699.8元/年起

问题

在python中运行并行请求会话

一码平川MACHEL 2019-12-01 19:34:31 621 浏览量 回答数 2

问题

Java中这个Python列表的等价性是什么样的?

一码平川MACHEL 2019-12-01 19:31:49 571 浏览量 回答数 3

回答

1、lambda是什么?举个例子如下:func=lambda x:x+1print(func(1))2print(func(2))3以上lambda等同于以下函数def func(x):return(x+1)复制代码  可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体。在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。  Python中,也有几个定义好的全局函数方便使用的,filter, map, reduce。from functools import reduce foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]print (list(filter(lambda x: x % 3 == 0, foo)))[18, 9, 24, 12, 27]print (list(map(lambda x: x * 2 + 10, foo)))[14, 46, 28, 54, 44, 58, 26, 34, 64]print (reduce(lambda x, y: x + y, foo))139复制代码  上面例子中的map的作用,非常简单清晰。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。     比如上面map的例子,可以写成:print ([x * 2 + 10 for x in foo]) 非常的简洁,易懂。         filter的例子可以写成:print ([x for x in foo if x % 3 == 0]) 同样也是比lambda的方式更容易理解。

元芳啊 2019-12-02 01:04:40 0 浏览量 回答数 0

问题

在国内python怎么调用googleapis

杨冬芳 2019-12-01 20:19:16 1333 浏览量 回答数 1

回答

Python3 元组Python 的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。实例(Python 3.0+) tup1 = ('Google', 'Runoob', 1997, 2000);tup2 = (1, 2, 3, 4, 5 );tup3 = "a", "b", "c", "d"; # 不需要括号也可以type(tup3) 创建空元组tup1 = ();元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:实例(Python 3.0+) tup1 = (50)type(tup1) # 不加逗号,类型为整型 tup1 = (50,)type(tup1) # 加上逗号,类型为元组

世事皆空 2019-12-02 01:06:53 0 浏览量 回答数 0

问题

flask+python如何获取input标签的用户输入

杨冬芳 2019-12-01 20:09:50 1425 浏览量 回答数 1

回答

Python 变量类型变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。 变量赋值Python 中的变量赋值不需要类型声明。每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- counter = 100 # 赋值整型变量miles = 1000.0 # 浮点型name = "John" # 字符串 print counterprint milesprint name 运行实例 »以上实例中,100,1000.0和"John"分别赋值给counter,miles,name变量。执行以上程序会输出如下结果:1001000.0John多个变量赋值Python允许你同时为多个变量赋值。例如:a = b = c = 1以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。您也可以为多个对象指定多个变量。例如:a, b, c = 1, 2, "john"以上实例,两个整型对象1和2的分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。 标准数据类型在内存中存储的数据可以有多种类型。例如,一个人的年龄可以用数字来存储,他的名字可以用字符来存储。Python 定义了一些标准类型,用于存储各种类型的数据。Python有五个标准的数据类型:Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典) Python数字数字数据类型用于存储数值。他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。当你指定一个值时,Number对象就会被创建:var1 = 1var2 = 10您也可以使用del语句删除一些对象的引用。del语句的语法是:del var1[,var2[,var3[....,varN]]]]您可以通过使用del语句删除单个或多个对象的引用。例如:del vardel var_a, var_bPython支持四种不同的数字类型:int(有符号整型)long(长整型[也可以代表八进制和十六进制])float(浮点型)complex(复数)实例一些数值类型的实例:int long float complex10 51924361L 0.0 3.14j100 -0x19323L 15.20 45.j-786 0122L -21.9 9.322e-36j080 0xDEFABCECBDAECBFBAEl 32.3e+18 .876j-0490 535633629843L -90. -.6545+0J-0x260 -052318172735L -32.54e100 3e+26J0x69 -4721885298529L 70.2E-12 4.53e-7j长整型也可以使用小写 l,但是还是建议您使用大写 L,避免与数字 1 混淆。Python使用 L 来显示长整型。Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。 Python字符串字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 :s="a1a2···an"(n>=0)它是编程语言中表示文本的数据类型。python的字串列表有2种取值顺序:从左到右索引默认0开始的,最大范围是字符串长度少1从右到左索引默认-1开始的,最大范围是字符串开头如果你要实现从字符串中获取一段子字符串的话,可以使用变量 [头下标:尾下标],就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。比如:s = 'ilovepython's[1:5]的结果是love。当使用以冒号分隔的字符串,python返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。上面的结果包含了s[1]的值l,而取到的最大范围不包括上边界,就是s[5]的值p。加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- str = 'Hello World!' print str # 输出完整字符串print str[0] # 输出字符串中的第一个字符print str[2:5] # 输出字符串中第三个至第五个之间的字符串print str[2:] # 输出从第三个字符开始的字符串print str * 2 # 输出字符串两次print str + "TEST" # 输出连接的字符串以上实例输出结果:Hello World!Hllollo World!Hello World!Hello World!Hello World!TESTPython列表List(列表) 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。列表用 [ ] 标识,是 python 最通用的复合数据类型。列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。加号 + 是列表连接运算符,星号 * 是重复操作。如下实例:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]tinylist = [123, 'john'] print list # 输出完整列表print list[0] # 输出列表的第一个元素print list[1:3] # 输出第二个至第三个元素 print list[2:] # 输出从第三个开始至列表末尾的所有元素print tinylist * 2 # 输出列表两次print list + tinylist # 打印组合的列表以上实例输出结果:['runoob', 786, 2.23, 'john', 70.2]runoob[786, 2.23][2.23, 'john', 70.2][123, 'john', 123, 'john']['runoob', 786, 2.23, 'john', 70.2, 123, 'john']Python元组元组是另一个数据类型,类似于List(列表)。元组用"()"标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )tinytuple = (123, 'john') print tuple # 输出完整元组print tuple[0] # 输出元组的第一个元素print tuple[1:3] # 输出第二个至第三个的元素 print tuple[2:] # 输出从第三个开始至列表末尾的所有元素print tinytuple * 2 # 输出元组两次print tuple + tinytuple # 打印组合的元组以上实例输出结果:('runoob', 786, 2.23, 'john', 70.2)runoob(786, 2.23)(2.23, 'john', 70.2)(123, 'john', 123, 'john')('runoob', 786, 2.23, 'john', 70.2, 123, 'john')以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]tuple[2] = 1000 # 元组中是非法应用list[2] = 1000 # 列表中是合法应用 Python 字典字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。字典用"{ }"标识。字典由索引(key)和它对应的值value组成。实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- dict = {}dict['one'] = "This is one"dict[2] = "This is two" tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print dict['one'] # 输出键为'one' 的值print dict[2] # 输出键为 2 的值print tinydict # 输出完整的字典print tinydict.keys() # 输出所有键print tinydict.values() # 输出所有值输出结果为:This is oneThis is two{'dept': 'sales', 'code': 6734, 'name': 'john'}['dept', 'code', 'name']['sales', 6734, 'john']Python数据类型转换有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。函数 描述int(x [,base])将x转换为一个整数long(x [,base] )将x转换为一个长整数float(x)将x转换到一个浮点数complex(real [,imag])创建一个复数str(x)将对象 x 转换为字符串repr(x)将对象 x 转换为表达式字符串eval(str)用来计算在字符串中的有效Python表达式,并返回一个对象tuple(s)将序列 s 转换为一个元组list(s)将序列 s 转换为一个列表set(s)转换为可变集合dict(d)创建一个字典。d 必须是一个序列 (key,value)元组。frozenset(s)转换为不可变集合chr(x)将一个整数转换为一个字符unichr(x)将一个整数转换为Unicode字符ord(x)将一个字符转换为它的整数值hex(x)将一个整数转换为一个十六进制字符串oct(x)将一个整数转换为一个八进制字符串

xuning715 2019-12-02 01:10:21 0 浏览量 回答数 0

回答

1.类的定义 代码如下: 复制代码复制代码 !/usr/bin/env python coding:utf8 class Hotel(object): """docstring for Hotel""" def __init__(self, room, cf=1.0, br=15): self.room = room self.cf = cf self.br = br def cacl_all(self, days=1): return (self.room * self.cf + self.br) * days if name == '__main__': stdroom = Hotel(200) big_room = Hotel(230, 0.9) print stdroom.cacl_all() print stdroom.cacl_all(2) print big_room.cacl_all() print big_room.cacl_all(3) 复制代码复制代码 2.父类、子类以及调用父类 代码如下: 复制代码复制代码 !/usr/bin/env python -- coding: utf-8 -- 父类 class AddBook(object): def __init__(self, name, phone): self.name = name self.phone = phone def get_phone(self): return self.phone 子类,继承 class EmplEmail(AddBook): def __init__(self, nm, ph, email): # AddBook.__init__(self, nm, ph) # 调用父类方法一 super(EmplEmail, self).__init__(nm, ph) # 调用父类方法二 self.email = email def get_email(self): return self.email 调用 if name == "__main__": Detian = AddBook('handetian', '18210413001') Meng = AddBook('shaomeng', '18210413002') print Detian.get_phone() print AddBook.get_phone(Meng) alice = EmplEmail('alice', '18210418888', 'alice@xkops.com') print alice.get_email(), alice.get_phone() 复制代码复制代码 3.类的组合使用 代码如下: 复制代码复制代码 !/usr/bin/env python -- coding: utf-8 -- '''1.class类的组合使用2.手机、邮箱、QQ等是可以变化的(定义在一起),姓名不可变(单独定义)。3.在另一个类中引用''' class Info(object): def __init__(self, phone, email, qq): self.phone = phone self.email = email self.qq = qq def get_phone(self): return self.phone def update_phone(self, newphone): self.phone = newphone print "手机号更改已更改" def get_email(self): return self.email class AddrBook(object): '''docstring for AddBook''' def __init__(self, name, phone, email, qq): self.name = name self.info = Info(phone, email, qq) if name == "__main__": Detian = AddrBook('handetian', '18210413001', 'detian@xkops.com', '123456') print Detian.info.get_phone() Detian.info.update_phone(18210413002) print Detian.info.get_phone() print Detian.info.get_email() 复制代码复制代码 4.内置功能(函数()加与不加的区别) 代码如下: 复制代码复制代码 !/usr/bin/env python coding:utf8 class Books(object): def __init__(self, title, author): self.title = title self.author = author def __str__(self): return self.title def __repr__(self): return self.title def __call__(self): print "%s is written by %s" %(self.title, self.author) if name == '__main__': pybook = Books('Core Python', 'Wesley') print pybook pybook() 复制代码 复制代码 复制代码复制代码 !/usr/bin/env python coding:utf8 class Number(object): """Custum object add/radd -> +; sub/rsub -> -; mul/rmul -> *; div/rdiv -> /; """ def __init__(self, number): self.number = number def __add__(self, other): return self.number + other def __radd__(self, other): return self.number + other def __sub__(self, other): return self.number - other def __rsub__(self, other): return other - self.number def __gt__(self, other): if self.number > other: return True return False if name == '__main__': num = Number(10) print num + 20 print 30 + num print num - 5 print 11 - num print num > 20

xuning715 2019-12-02 01:10:24 0 浏览量 回答数 0

回答

问题是,一旦您持久保存数据,second_id就会将其合并到缓存表中,不再被视为常量。因此,计划程序无法再推断查询应该表示为笛卡尔积,并使用标准SortMergeJoin的哈希分区second_id。在不使用持久性的情况下实现相同的结果将是微不足道的 udffrom pyspark.sql.functions import lit, pandas_udf, PandasUDFType@pandas_udf('integer', PandasUDFType.SCALAR) def identity(x):return x second_df = second_df.withColumn('second_id', identity(lit(1)))result_df = first_df.join(second_df, first_df.first_id == second_df.second_id, 'inner') result_df.explain()== Physical Plan ==*(6) SortMergeJoin [cast(first_id#4 as int)], [second_id#129], Inner:- *(2) Sort [cast(first_id#4 as int) ASC NULLS FIRST], false, 0: +- Exchange hashpartitioning(cast(first_id#4 as int), 200): +- *(1) Filter isnotnull(first_id#4): +- Scan ExistingRDD[first_id#4]+- *(5) Sort [second_id#129 ASC NULLS FIRST], false, 0 +- Exchange hashpartitioning(second_id#129, 200) +- *(4) Project [some_value#6, pythonUDF0#154 AS second_id#129] +- ArrowEvalPython [identity(1)], [some_value#6, pythonUDF0#154] +- *(3) Project [some_value#6] +- *(3) Filter isnotnull(pythonUDF0#153) +- ArrowEvalPython [identity(1)], [some_value#6, pythonUDF0#153] +- Scan ExistingRDD[some_value#6]然而,SortMergeJoin这不是你应该尝试在这里实现的。使用常量键,除了玩具数据外,它会导致极端的数据偏差,并且可能会失败。然而,笛卡尔积虽然价格昂贵,但不会遇到这个问题,因此这里应该优先考虑。因此,它建议启用交叉连接或使用显式交叉连接语法(Spark 2.x的spark.sql.crossJoin.enabled)并继续。一个悬而未决的问题仍然是如何在缓存数据时防止意外行为。不幸的是,我没有为此做好准备。我相当确定可以使用自定义优化器规则,但这不是单独用Python完成的事情。

社区小助手 2019-12-02 01:47:43 0 浏览量 回答数 0

回答

这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar 简介gz: 即gzip,通常只能压缩一个文件。与tar结合起来就可以实现先打包,再压缩。 tar: linux系统下的打包工具,只打包,不压缩 tgz:即tar.gz。先用tar打包,然后再用gz压缩得到的文件 zip: 不同于gzip,虽然使用相似的算法,可以打包压缩多个文件,不过分别压缩文件,压缩率低于tar。 rar:打包压缩文件,最初用于DOS,基于window操作系统。压缩率比zip高,但速度慢,随机访问的速度也慢。 关于zip于rar之间的各种比较,可见: http://www.comicer.com/stronghorse/water/software/ziprar.htm gz由于gz一般只压缩一个文件,所有常与其他打包工具一起工作。比如可以先用tar打包为XXX.tar,然后在压缩为XXX.tar.gz 解压gz,其实就是读出其中的单一文件,Python方法如下: [python] view plain copyimport gzip import os def un_gz(file_name): """ungz zip file""" f_name = file_name.replace(".gz", "") #获取文件的名称,去掉 g_file = gzip.GzipFile(file_name) #创建gzip对象 open(f_name, "w+").write(g_file.read()) #gzip对象用read()打开后,写入open()建立的文件中。 g_file.close() #关闭gzip对象 tarXXX.tar.gz解压后得到XXX.tar,还要进一步解压出来。 *注:tgz与tar.gz是相同的格式,老版本DOS扩展名最多三个字符,故用tgz表示。 由于这里有多个文件,我们先读取所有文件名,然后解压,如下: [python] view plain copyimport tarfile def un_tar(file_name): untar zip file""" tar = tarfile.open(file_name) names = tar.getnames() if os.path.isdir(file_name + "_files"): pass else: os.mkdir(file_name + "_files") #由于解压后是许多文件,预先建立同名文件夹 for name in names: tar.extract(name, file_name + "_files/") tar.close() *注:tgz文件与tar文件相同的解压方法。 zip与tar类似,先读取多个文件名,然后解压,如下: [python] view plain copyimport zipfile def un_zip(file_name): """unzip zip file""" zip_file = zipfile.ZipFile(file_name) if os.path.isdir(file_name + "_files"): pass else: os.mkdir(file_name + "_files") for names in zip_file.namelist(): zip_file.extract(names,file_name + "_files/") zip_file.close() rar因为rar通常为window下使用,需要额外的Python包rarfile。 可用地址: http://sourceforge.net/projects/rarfile.berlios/files/rarfile-2.4.tar.gz/download 解压到Python安装目录的/Scripts/目录下,在当前窗口打开命令行, 输入Python setup.py install 安装完成。 [python] view plain copyimport rarfile import os def un_rar(file_name): """unrar zip file""" rar = rarfile.RarFile(file_name) if os.path.isdir(file_name + "_files"): pass else: os.mkdir(file_name + "_files") os.chdir(file_name + "_files"): rar.extractall() rar.close() tar打包在写打包代码的过程中,使用tar.add()增加文件时,会把文件本身的路径也加进去,加上arcname就能根据自己的命名规则将文件加入tar包打包代码: !/usr/bin/env /usr/local/bin/python # encoding: utf-8 import tarfile import os import time start = time.time() tar=tarfile.open('/path/to/your.tar,'w') for root,dir,files in os.walk('/path/to/dir/'): for file in files: fullpath=os.path.join(root,file) tar.add(fullpath,arcname=file) tar.close() print time.time()-start 在打包的过程中可以设置压缩规则,如想要以gz压缩的格式打包tar=tarfile.open('/path/to/your.tar.gz','w:gz')其他格式如下表:tarfile.open的mode有很多种:mode action'r' or 'r:*' Open for reading with transparent compression (recommended).'r:' Open for reading exclusively without compression.'r:gz' Open for reading with gzip compression.'r:bz2' Open for reading with bzip2 compression.'a' or 'a:' Open for appending with no compression. The file is created if it does not exist.'w' or 'w:' Open for uncompressed writing.'w:gz' Open for gzip compressed writing.'w:bz2' Open for bzip2 compressed writing. tar解包tar解包也可以根据不同压缩格式来解压。 !/usr/bin/env /usr/local/bin/python # encoding: utf-8 import tarfile import time start = time.time() t = tarfile.open("/path/to/your.tar", "r:") t.extractall(path = '/path/to/extractdir/') t.close() print time.time()-start 上面的代码是解压所有的,也可以挨个起做不同的处理,但要如果tar包内文件过多,小心内存哦~tar = tarfile.open(filename, 'r:gz') for tar_info in tar: file = tar.extractfile(tar_info) do_something_with(file)

xuning715 2019-12-02 01:10:34 0 浏览量 回答数 0

回答

用python往文件中写东西时候必须先用open('XXX.txt') 打开文件,但是在引号 " " 中无法使变量迭代。经过查资料发现,open() 中可以放入string型变量。这样问题就解决了。 代码如下: i=1ll=['a','b','c','e','f']for it in ll: i_str=str(i) filename=i_str+'.txt' f=open( filename,'w') f.write("something") f.close() i=i+1

元芳啊 2019-12-02 01:04:41 0 浏览量 回答数 0

回答

应用一些正则表达式并转换为rdd可能对您有用。 先使用textFile以下方法读取文件: a=spark.read.option('multiline',"true").text('aa.json')a.show(truncate=False) +-------------------------------------+ |value | +-------------------------------------+ |[[{"foo":"test1"},{"foo1":"test21"}],| |[{"foo":"test2"},{"foo1":"test22"}], | |[{"foo":"test3"},{"foo1":"test23"}]] | +-------------------------------------+ 现在我们可以使用pyspark.sql.functions.regexp_replace从每行中删除额外的方括号和尾随逗号: from pyspark.sql.functions import regexp_replacea = a.select(regexp_replace("value", "(^[(?=[))|((?<=])]$)|(,$)", "").alias("value"))a.show(truncate=False) +-----------------------------------+ |value | +-----------------------------------+ |[{"foo":"test1"},{"foo1":"test21"}]| |[{"foo":"test2"},{"foo1":"test22"}]| |[{"foo":"test3"},{"foo1":"test23"}]| +-----------------------------------+ 这里的模式是逻辑或以下模式: ^[(?=[):字符串开头后跟[[(第二[个是非捕获组)(?<=])]$:]]在字符串的末尾(第]一个是非捕获组),$:字符串末尾的逗号任何匹配的模式都将替换为空字符串。 现在转换为rdd并使用json.loads将行解析为字典列表。然后将所有这些字典合并到一个字典中并调用pyspark.sql.Row构造函数。最后调用.toDF转换回DataFrame。 From How to merge two dictionaries in a single expression? This code works for python 2 and 3 def merge_two_dicts(x, y): z = x.copy() # start with x's keys and values z.update(y) # modifies z with y's keys and values & returns None return z import jsonfrom pyspark.sql import Rowfrom functools import reduce a.rdd.map(lambda x: Row(**reduce(merge_two_dicts, json.loads(x['value'])))).toDF().show() +-----+------+ | foo| foo1| +-----+------+ |test1|test21| |test2|test22| |test3|test23| +-----+------+

社区小助手 2019-12-02 01:50:55 0 浏览量 回答数 0

问题

如何在python中将参数滑块添加到微分方程图?

一码平川MACHEL 2019-12-01 19:32:10 389 浏览量 回答数 1

回答

一、解释 递归:在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归 注:Python在递归中没有像别的语言对递归进行优化,所以他的每一次调用都会基于上一次的调用进行,并且他设置了最大的递归数量防止递归外溢 二、实例 直接调用自己: def func(): print('from func') func() func()复制代码 间接调用自己 def foo(): print('from foo') bar() def bar(): print('from bar') foo() foo()复制代码复制代码 递归的实现: def age(n): if n == 1: return 18 return age(n-1)+2 print(age(5)) age(5)=age(4)+2 第一次进入 age(4)=age(3)+2 第二次进入 age(3)=age(2)+2 第三次进入 age(2)=age(1)+2 第四次进入 age(1)=18 第五次进入,最后判断终止条件 age(n)=age(n-1)+2 #n>1 递归终止条件 age(1)=18 #n=1 等于终止条件 复制代码三、递归的回溯与递推 递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推 回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯 复制代码 实例 l =[1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]] def search(l): for item in l: if type(item) is list: search(item) else: print(item) search(l) 递归算法 1、递归的定义 递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。 递归常与分治思想同时使用,能产生许多高校的算法。递归常用来解决结构相似的问题。所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。。实际上,递归是把一个不能或不好解决的大问题转化成一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素: (1) 边界条件:确定递归到何时终止,也称为递归出口。 (2) 递归模式:大问题是如何分解为小问题的,也称为递归体。 递归函数只有具备了这两个要素,才能在有限次计算后得出结果。 2、递归算法实例 2.1求一个整数n的阶乘 阶乘的定义如下图: 图1 根据阶乘的递归定义,很容易就能写出求阶乘的递归算法。 def factorial(n) : if n == 1 : return 1 #递归结束 return n * factorial(n - 1) #问题规模减1,递归调用123452.2汉诺塔 汉诺塔问题是递归函数的经典应用,它来自一个古老传说:在世界刚被创建的时候有一座钻石宝塔A,其上有64个金蝶。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔B和C。从世界创始之日起,波罗门的牧师就一直在试图把塔A上的碟子移动到C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成这个任务时,世界末日也就到了。 对于汉诺塔问题的求解,可以通过以下3步实现: (1)将塔A上的n -1个碟子借助C塔先移动到B塔上; (2)把塔A上剩下的一个碟子移动到塔C上; (3)将n - 1个碟子从B塔借助塔A移动到塔C上。 很显然,这是一个递归求解的过程,假设碟子数n=3时,汉诺塔问题的求解过程如下图所示: 图2 汉诺塔的递归算法(Python实现): def Hanoi(n, A, B, C) : if (n == 1) : move(A, c) #表示只有一个碟子时,直接从A塔移动到C塔 else : Hanoi(n - 1, A, C, B) #将剩下的A塔上的n-1借助C塔移动到B塔 move(A, C) #将A上最后一个直接移动到C塔上 Hanoi(n - 1, B, A, C) #将B塔上的n-1个碟子借助A塔移动到C塔 12345678递归函数的运行轨迹 借助汉诺塔这个实例,来讲解一下递归函数的运行轨迹。在递归函数中,调用函数和被调用函数都是同一个函数,需要注意的是函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之退出i+1层调用应该返回第i层。下图是n=3时汉诺塔算法的运行轨迹,有向弧上的数字表示递归调用和返回的执行顺序。 图3 汉诺塔的递归算法代码实现: coding=utf-8 i = 1def move(n, mfrom, mto) : global i print "第%d步:将%d号盘子从%s -> %s" %(i, n, mfrom, mto) i += 1 def hanoi(n, A, B, C) : if n == 1 : move(1, A, C) else : hanoi(n - 1, A, C, B) move(n, A, C) hanoi(n - 1, B, A, C) 程序入口 try : n = int(raw_input("please input a integer :")) print "移动步骤如下:" hanoi(n, 'A', 'B', 'C')except ValueError: print "please input a integer n(n > 0)!" 123456789101112131415161718192021222324执行结果: 结果 2.3 斐波拉契数列 斐波拉契数列,是这样的一个数列:0、1、1、2、3、5、8、13、21、……。 斐波拉契数列的核心思想是: 从第三项起,每一项都等于前两项的和,即F(N) = F(N - 1) + F(N - 2) (N >= 2) 并且规定F(0) = 0,F(1) = 1 要求:利用递归算法获得指定项的斐波拉契数列。 !/usr/bin/python coding=utf-8 def fib_list(n) : if n == 1 or n == 2 : return 1 else : m = fib_list(n - 1) + fib_list(n - 2) return m print "请输入要打印的斐波拉契数列项数n的值*"try : n = int(raw_input("enter:"))except ValueError : print "请输入一个整数!" exit()list2 = [0]tmp = 1while(tmp <= n): list2.append(fib_list(tmp)) tmp += 1print list2

xuning715 2019-12-02 01:10:16 0 浏览量 回答数 0

回答

在Python中,变量的概念基本上和初中代数的方程变量是一致的。例如,对于方程式 y=x*x ,x就是变量。当x=2时,计算结果是4,当x=5时,计算结果是25。只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,比如:a = 1变量a是一个整数。t_007 = 'T007'变量t_007是一个字符串。在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,例如:a = 123 # a是整数print aa = 'imooc' # a变为字符串print a这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):int a = 123; // a是整数类型变量a = "mooc"; // 错误:不能把字符串赋给整型变量和静态语言相比,动态语言更灵活,就是这个原因。请不要把赋值语句的等号等同于数学的等号。比如下面的代码:x = 10x = x + 2如果从数学上理解x = x + 2那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式x + 2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12。最后,理解变量在计算机内存中的表示也非常重要。当我们写:a = 'ABC'时,Python解释器干了两件事情:在内存中创建了一个'ABC'的字符串;在内存中创建了一个名为a的变量,并把它指向'ABC'。也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:a = 'ABC'b = aa = 'XYZ'print b最后一行打印出变量b的内容到底是'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出b和a相同,也应该是'XYZ',但实际上b的值是'ABC',让我们一行一行地执行代码,就可以看到到底发生了什么事:执行a = 'ABC',解释器创建了字符串 'ABC'和变量 a,并把a指向 'ABC':执行b = a,解释器创建了变量 b,并把b指向 a 指向的字符串'ABC':执行a = 'XYZ',解释器创建了字符串'XYZ',并把a的指向改为'XYZ',但b并没有更改:所以,最后打印变量b的结果自然是'ABC'了。

xuning715 2019-12-02 01:10:11 0 浏览量 回答数 0

回答

Python 的 Decorator在使用上和Java/C#的Annotation很相似,就是在方法名前面加一个@XXX注解来为这个方法装饰一些东西。但是,Java/C#的Annotation也很让人望而却步,太TMD的复杂了,你要玩它,你需要了解一堆Annotation的类库文档,让人感觉就是在学另外一门语言。 而Python使用了一种相对于Decorator Pattern和Annotation来说非常优雅的方法,这种方法不需要你去掌握什么复杂的OO模型或是Annotation的各种类库规定,完全就是语言层面的玩法:一种函数式编程的技巧。如果你看过本站的《函数式编程》,你一定会为函数式编程的那种“描述你想干什么,而不是描述你要怎么去实现”的编程方式感到畅快。(如果你不了解函数式编程,那在读本文之前,还请你移步去看看《函数式编程》) 好了,我们先来点感性认识,看一个Python修饰器的Hello World的代码。 Hello World 下面是代码:文件名:hello.py def hello(fn): def wrapper(): print "hello, %s" % fn.__name__ fn() print "goodby, %s" % fn.__name__ return wrapper @hellodef foo(): print "i am foo" foo() 当你运行代码,你会看到如下输出: [chenaho@chenhao-air]$ python hello.pyhello, fooi am foogoodby, foo 你可以看到如下的东西: 1)函数foo前面有个@hello的“注解”,hello就是我们前面定义的函数hello 2)在hello函数中,其需要一个fn的参数(这就用来做回调的函数) 3)hello函数中返回了一个inner函数wrapper,这个wrapper函数回调了传进来的fn,并在回调前后加了两条语句。 Decorator 的本质 对于Python的这个@注解语法糖- Syntactic Sugar 来说,当你在用某个@decorator来修饰某个函数func时,如下所示: @decoratordef func(): pass 其解释器会解释成下面这样的语句: func = decorator(func) 尼玛,这不就是把一个函数当参数传到另一个函数中,然后再回调吗?是的,但是,我们需要注意,那里还有一个赋值语句,把decorator这个函数的返回值赋值回了原来的func。 根据《函数式编程》中的first class functions中的定义的,你可以把函数当成变量来使用,所以,decorator必需得返回了一个函数出来给func,这就是所谓的higher order function 高阶函数,不然,后面当func()调用的时候就会出错。 就我们上面那个hello.py里的例子来说, @hellodef foo(): print "i am foo" 被解释成了: foo = hello(foo) 是的,这是一条语句,而且还被执行了。你如果不信的话,你可以写这样的程序来试试看: def fuck(fn): print "fuck %s!" % fn.__name__[::-1].upper() @fuckdef wfg(): pass 没了,就上面这段代码,没有调用wfg()的语句,你会发现, fuck函数被调用了,而且还很NB地输出了我们每个人的心声! 再回到我们hello.py的那个例子,我们可以看到,hello(foo)返回了wrapper()函数,所以,foo其实变成了wrapper的一个变量,而后面的foo()执行其实变成了wrapper()。 知道这点本质,当你看到有多个decorator或是带参数的decorator,你也就不会害怕了。 比如:多个decorator @decorator_one@decorator_twodef func(): pass 相当于: func = decorator_one(decorator_two(func)) 比如:带参数的decorator: @decorator(arg1, arg2)def func(): pass 相当于: func = decorator(arg1,arg2)(func) 这意味着decorator(arg1, arg2)这个函数需要返回一个“真正的decorator”。 带参数及多个Decrorator 我们来看一个有点意义的例子:html.py def makeHtmlTag(tag, args, *kwds): def real_decorator(fn): css_class = " class='{0}'".format(kwds["css_class"]) if "css_class" in kwds else "" def wrapped(*args, **kwds): return "<"+tag+css_class+">" + fn(*args, **kwds) + "</"+tag+">" return wrapped return real_decorator @makeHtmlTag(tag="b", css_class="bold_css")@makeHtmlTag(tag="i", css_class="italic_css")def hello(): return "hello world" print hello() 输出: hello world 在上面这个例子中,我们可以看到:makeHtmlTag有两个参数。所以,为了让 hello = makeHtmlTag(arg1, arg2)(hello) 成功,makeHtmlTag 必需返回一个decorator(这就是为什么我们在makeHtmlTag中加入了real_decorator()的原因),这样一来,我们就可以进入到 decorator 的逻辑中去了—— decorator得返回一个wrapper,wrapper里回调hello。看似那个makeHtmlTag() 写得层层叠叠,但是,已经了解了本质的我们觉得写得很自然。 你看,Python的Decorator就是这么简单,没有什么复杂的东西,你也不需要了解过多的东西,使用起来就是那么自然、体贴、干爽、透气,独有的速效凹道和完美的吸收轨迹,让你再也不用为每个月的那几天感到焦虑和不安,再加上贴心的护翼设计,量多也不用当心。对不起,我调皮了。 什么,你觉得上面那个带参数的Decorator的函数嵌套太多了,你受不了。好吧,没事,我们看看下面的方法。 class式的 Decorator 首先,先得说一下,decorator的class方式,还是看个示例: class myDecorator(object): def __init__(self, fn): print "inside myDecorator.__init__()" self.fn = fn def __call__(self): self.fn() print "inside myDecorator.__call__()" @myDecoratordef aFunction(): print "inside aFunction()" print "Finished decorating aFunction()" aFunction() 输出: inside myDecorator.__init__() Finished decorating aFunction() inside aFunction() inside myDecorator.__call__() 上面这个示例展示了,用类的方式声明一个decorator。我们可以看到这个类中有两个成员:1)一个是__init__(),这个方法是在我们给某个函数decorator时被调用,所以,需要有一个fn的参数,也就是被decorator的函数。2)一个是__call__(),这个方法是在我们调用被decorator函数时被调用的。上面输出可以看到整个程序的执行顺序。 这看上去要比“函数式”的方式更易读一些。 下面,我们来看看用类的方式来重写上面的html.py的代码:html.py class makeHtmlTagClass(object): def __init__(self, tag, css_class=""): self._tag = tag self._css_class = " class='{0}'".format(css_class) if css_class !="" else "" def __call__(self, fn): def wrapped(*args, **kwargs): return "<" + self._tag + self._css_class+">" + fn(*args, **kwargs) + "</" + self._tag + ">" return wrapped @makeHtmlTagClass(tag="b", css_class="bold_css")@makeHtmlTagClass(tag="i", css_class="italic_css")def hello(name): return "Hello, {}".format(name) print hello("Hao Chen") 上面这段代码中,我们需要注意这几点:1)如果decorator有参数的话,__init__() 成员就不能传入fn了,而fn是在__call__的时候传入的。2)这段代码还展示了 wrapped(args, *kwargs) 这种方式来传递被decorator函数的参数。(其中:args是一个参数列表,kwargs是参数dict,具体的细节,请参考Python的文档或是StackOverflow的这个问题,这里就不展开了) 用Decorator设置函数的调用参数 你有三种方法可以干这个事: 第一种,通过 **kwargs,这种方法decorator会在kwargs中注入参数。 def decorate_A(function): def wrap_function(*args, **kwargs): kwargs['str'] = 'Hello!' return function(*args, **kwargs) return wrap_function @decorate_Adef print_message_A(args, *kwargs): print(kwargs['str']) print_message_A() 第二种,约定好参数,直接修改参数 def decorate_B(function): def wrap_function(*args, **kwargs): str = 'Hello!' return function(str, *args, **kwargs) return wrap_function @decorate_Bdef print_message_B(str, args, *kwargs): print(str) print_message_B() 第三种,通过 *args 注入 def decorate_C(function): def wrap_function(*args, **kwargs): str = 'Hello!' #args.insert(1, str) args = args +(str,) return function(*args, **kwargs) return wrap_function class Printer: @decorate_C def print_message(self, str, *args, **kwargs): print(str) p = Printer()p.print_message() Decorator的副作用 到这里,我相信你应该了解了整个Python的decorator的原理了。 相信你也会发现,被decorator的函数其实已经是另外一个函数了,对于最前面那个hello.py的例子来说,如果你查询一下foo.__name__的话,你会发现其输出的是“wrapper”,而不是我们期望的“foo”,这会给我们的程序埋一些坑。所以,Python的functool包中提供了一个叫wrap的decorator来消除这样的副作用。下面是我们新版本的hello.py。文件名:hello.py from functools import wrapsdef hello(fn): @wraps(fn) def wrapper(): print "hello, %s" % fn.__name__ fn() print "goodby, %s" % fn.__name__ return wrapper @hellodef foo(): '''foo help doc''' print "i am foo" pass foo()print foo.__name__ #输出 fooprint foo.__doc__ #输出 foo help doc 当然,即使是你用了functools的wraps,也不能完全消除这样的副作用。 来看下面这个示例: from inspect import getmembers, getargspecfrom functools import wraps def wraps_decorator(f): @wraps(f) def wraps_wrapper(*args, **kwargs): return f(*args, **kwargs) return wraps_wrapper class SomeClass(object): @wraps_decorator def method(self, x, y): pass obj = SomeClass()for name, func in getmembers(obj, predicate=inspect.ismethod): print "Member Name: %s" % name print "Func Name: %s" % func.func_name print "Args: %s" % getargspec(func)[0] 输出: Member Name: method Func Name: method Args: [] 你会发现,即使是你你用了functools的wraps,你在用getargspec时,参数也不见了。 要修正这一问,我们还得用Python的反射来解决,下面是相关的代码: def get_true_argspec(method): argspec = inspect.getargspec(method) args = argspec[0] if args and args[0] == 'self': return argspec if hasattr(method, '__func__'): method = method.__func__ if not hasattr(method, 'func_closure') or method.func_closure is None: raise Exception("No closure for method.") method = method.func_closure[0].cell_contents return get_true_argspec(method) 当然,我相信大多数人的程序都不会去getargspec。所以,用functools的wraps应该够用了。 一些decorator的示例 好了,现在我们来看一下各种decorator的例子: 给函数调用做缓存 这个例实在是太经典了,整个网上都用这个例子做decorator的经典范例,因为太经典了,所以,我这篇文章也不能免俗。 from functools import wrapsdef memo(fn): cache = {} miss = object() @wraps(fn) def wrapper(*args): result = cache.get(args, miss) if result is miss: result = fn(*args) cache[args] = result return result return wrapper @memodef fib(n): if n < 2: return n return fib(n - 1) + fib(n - 2) 上面这个例子中,是一个斐波拉契数例的递归算法。我们知道,这个递归是相当没有效率的,因为会重复调用。比如:我们要计算fib(5),于是其分解成fib(4) + fib(3),而fib(4)分解成fib(3)+fib(2),fib(3)又分解成fib(2)+fib(1)…… 你可看到,基本上来说,fib(3), fib(2), fib(1)在整个递归过程中被调用了两次。 而我们用decorator,在调用函数前查询一下缓存,如果没有才调用了,有了就从缓存中返回值。一下子,这个递归从二叉树式的递归成了线性的递归。 Profiler的例子 这个例子没什么高深的,就是实用一些。 import cProfile, pstats, StringIO def profiler(func): def wrapper(*args, **kwargs): datafn = func.__name__ + ".profile" # Name the data file prof = cProfile.Profile() retval = prof.runcall(func, *args, **kwargs) #prof.dump_stats(datafn) s = StringIO.StringIO() sortby = 'cumulative' ps = pstats.Stats(prof, stream=s).sort_stats(sortby) ps.print_stats() print s.getvalue() return retval return wrapper 注册回调函数 下面这个示例展示了通过URL的路由来调用相关注册的函数示例: class MyApp(): def __init__(self): self.func_map = {} def register(self, name): def func_wrapper(func): self.func_map[name] = func return func return func_wrapper def call_method(self, name=None): func = self.func_map.get(name, None) if func is None: raise Exception("No function registered against - " + str(name)) return func() app = MyApp() @app.register('/')def main_page_func(): return "This is the main page." @app.register('/next_page')def next_page_func(): return "This is the next page." print app.call_method('/')print app.call_method('/next_page') 注意:1)上面这个示例中,用类的实例来做decorator。2)decorator类中没有__call__(),但是wrapper返回了原函数。所以,原函数没有发生任何变化。 给函数打日志 下面这个示例演示了一个logger的decorator,这个decorator输出了函数名,参数,返回值,和运行时间。 from functools import wrapsdef logger(fn): @wraps(fn) def wrapper(*args, **kwargs): ts = time.time() result = fn(*args, **kwargs) te = time.time() print "function = {0}".format(fn.__name__) print " arguments = {0} {1}".format(args, kwargs) print " return = {0}".format(result) print " time = %.6f sec" % (te-ts) return result return wrapper @loggerdef multipy(x, y): return x * y @loggerdef sum_num(n): s = 0 for i in xrange(n+1): s += i return s print multipy(2, 10)print sum_num(100)print sum_num(10000000) 上面那个打日志还是有点粗糙,让我们看一个更好一点的(带log level参数的): import inspectdef get_line_number(): return inspect.currentframe().f_back.f_back.f_lineno def logger(loglevel): def log_decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): ts = time.time() result = fn(*args, **kwargs) te = time.time() print "function = " + fn.__name__, print " arguments = {0} {1}".format(args, kwargs) print " return = {0}".format(result) print " time = %.6f sec" % (te-ts) if (loglevel == 'debug'): print " called_from_line : " + str(get_line_number()) return result return wrapper return log_decorator 但是,上面这个带log level参数的有两具不好的地方,1) loglevel不是debug的时候,还是要计算函数调用的时间。2) 不同level的要写在一起,不易读。 我们再接着改进: import inspect def advance_logger(loglevel): def get_line_number(): return inspect.currentframe().f_back.f_back.f_lineno def _basic_log(fn, result, *args, **kwargs): print "function = " + fn.__name__, print " arguments = {0} {1}".format(args, kwargs) print " return = {0}".format(result) def info_log_decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): result = fn(*args, **kwargs) _basic_log(fn, result, args, kwargs) return wrapper def debug_log_decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): ts = time.time() result = fn(*args, **kwargs) te = time.time() _basic_log(fn, result, args, kwargs) print " time = %.6f sec" % (te-ts) print " called_from_line : " + str(get_line_number()) return wrapper if loglevel is "debug": return debug_log_decorator else: return info_log_decorator 你可以看到两点,1)我们分了两个log level,一个是info的,一个是debug的,然后我们在外尾根据不同的参数返回不同的decorator。2)我们把info和debug中的相同的代码抽到了一个叫_basic_log的函数里,DRY原则。 一个MySQL的Decorator 下面这个decorator是我在工作中用到的代码,我简化了一下,把DB连接池的代码去掉了,这样能简单点,方便阅读。 import umysqlfrom functools import wraps class Configuraion: def __init__(self, env): if env == "Prod": self.host = "coolshell.cn" self.port = 3306 self.db = "coolshell" self.user = "coolshell" self.passwd = "fuckgfw" elif env == "Test": self.host = 'localhost' self.port = 3300 self.user = 'coolshell' self.db = 'coolshell' self.passwd = 'fuckgfw' def mysql(sql): _conf = Configuraion(env="Prod") def on_sql_error(err): print err sys.exit(-1) def handle_sql_result(rs): if rs.rows > 0: fieldnames = [f[0] for f in rs.fields] return [dict(zip(fieldnames, r)) for r in rs.rows] else: return [] def decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): mysqlconn = umysql.Connection() mysqlconn.settimeout(5) mysqlconn.connect(_conf.host, _conf.port, _conf.user, _conf.passwd, _conf.db, True, 'utf8') try: rs = mysqlconn.query(sql, {}) except umysql.Error as e: on_sql_error(e) data = handle_sql_result(rs) kwargs["data"] = data result = fn(*args, **kwargs) mysqlconn.close() return result return wrapper return decorator @mysql(sql = "select * from coolshell" )def get_coolshell(data): ... ... ... .. 线程异步 下面量个非常简单的异步执行的decorator,注意,异步处理并不简单,下面只是一个示例。 from threading import Threadfrom functools import wraps def async(func): @wraps(func) def async_func(*args, **kwargs): func_hl = Thread(target = func, args = args, kwargs = kwargs) func_hl.start() return func_hl return async_func if name == '__main__': from time import sleep @async def print_somedata(): print 'starting print_somedata' sleep(2) print 'print_somedata: 2 sec passed' sleep(2) print 'print_somedata: 2 sec passed' sleep(2) print 'finished print_somedata' def main(): print_somedata() print 'back in main' print_somedata() print 'back in main' main() 其它 关于更多的示例,你可以参看: Python Decorator Library来源:网络

51干警网 2019-12-02 01:10:47 0 浏览量 回答数 0

回答

在同一个文件夹下 调用函数: A.py文件: [python] view plain copydef add(x,y): print('和为:%d'%(x+y)) B.py文件:[python] view plain copyimport A A.add(1,2) 或[python] view plain copyfrom A import add add(1,2) 调用类: A.py文件: [python] view plain copyclass A: def __init__(self,xx,yy): self.x=xx self.y=yy def add(self): print("x和y的和为:%d"%(self.x+self.y)) B.py文件:[python] view plain copyfrom A import A a=A(2,3) a.add() 或[python] view plain copyimport A a=A.A(2,3) a.add() 在不同文件夹下 A.py文件的文件路径:E:PythonProjectwinycg B.py文件:[python] view plain copyimport sys sys.path.append(r'E:PythonProjectwinycg') '''''python import模块时, 是在sys.path里按顺序查找的。 sys.path是一个列表,里面以字符串的形式存储了许多路径。 使用A.py文件中的函数需要先将他的文件路径放到sys.path中''' import A a=A.A(2,3) a.add()

xuning715 2019-12-02 01:10:15 0 浏览量 回答数 0

回答

Python数字,python支持四种不同的数据类型 int整型 long长整型 float浮点型 complex复数var1 = 10; #表示整型var2 = 678L #表示长整型var3 = 12.34;#表示浮点型var4 = 123j #复数var5 = 123+45j #复数L表示长整形nt最大值在sys.maxint,超过这个值会自动转换成long

覃溪哈哈 2019-12-02 01:49:32 0 浏览量 回答数 0

回答

接触Python时间不长,对有些知识点,掌握的不是很扎实,我个人比较崇尚不管学习什么东西,首先一定回去把基础打的非常扎实了,再往高处走。今天遇到了Python中的全局变量的相关操作,遇到了问题,所以,在这里将自己遇到的问题,做个记录,以长记心!!!在Python中使用全局变量,其实,个人认为并不是很明智的选择;但是自己还是坚信,存在便合理,在于你怎么使用;全局变量降低了模块和函数之间的通用性;所以,在以后的编程过程中,应尽量避免使用全局变量。全局变量的使用:方法一:为了便于代码管理,将全局变量统一放到一个模块中,然后在使用全局变量的时候,导入全局变量模块,通过这种方法来进行使用全局变量; 在一个模块中定义全局变量:复制代码 代码如下:#global.py GLOBAL_1 = 1 GLOBAL_2 = 2 GLOBAL_3 = 'Hello World' 然后在一个模块中导入全局变量定义模块,在新模块中使用全局变量:复制代码 代码如下:import globalValues def printGlobal(): print(globalValues.GLOBAL_1) print(globalValues.GLOBAL_3) globalValues.GLOBAL_2 += 1 # modify values if name == '__main__': printGlobal() print(globalValues.GLOBAL_2) 方法二:直接在模块中定义全局变量,然后在函数中直接使用就ok了。但是在使用全局变量的时候,必须在函数中使用global关键字进行标识:复制代码 代码如下:CONSTANT = 0 def modifyGlobal(): global CONSTANT print(CONSTANT) CONSTANT += 1 if name == '__main__': modifyGlobal() print(CONSTANT)

xuning715 2019-12-02 01:10:04 0 浏览量 回答数 0

问题

TypeError:check()缺少1个必需的位置参数:'self'

一码平川MACHEL 2019-12-01 19:32:06 918 浏览量 回答数 1

问题

在Spark Streaming Python中将RDD转换为Dataframe

社区小助手 2019-12-01 19:29:06 763 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 用户可以在 HTTP 请求中增加 Authorization(授权)的 Head 来包含签名 (Signature)信息,表明这个消息已被授权。  Authorization 字段计算方法如下: "Authorization: OSS " + Access Key Id + ":" + Signature Signature = base64(hmac-sha1(VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + DATE + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource)) CONTENT-MD5    //表示请求内容数据的 MD5 值 CONTENT-TYPE   //表示请求内容的类型 DATE 表示此次操作的时间,且必须为 HTTP1.1 中支持的 GMT 格式 CanonicalizedOSSHeaders    //表示 http 中的 object meta 组合CanonicalizedResource        //表示用户想要访问的 OSS 资源  验证方法如下:>>> import base64,hmac,sha>>> base64.encodestring(hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV","PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM=\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-oss-magic:abracadabra\nx-oss-meta-author:foo@bar.com\n/oss-example/nelson",sha).digest()).strip(), '26NBxoKdsyly4EDv6inkoDft/yA='('26NBxoKdsyly4EDv6inkoDft/yA=', '26NBxoKdsyly4EDv6inkoDft/yA=‘)>>>  首先,在python环境下import base64,hmac,sha 其次,输入签名参数。  OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV 这个是key secret,测试过程需要替换成客户的key secret。Thu, 17 Nov 2005 18:49:58 GMT 和 /oss-example/nelson 分别是DATE和CanonicalizedResource,这两个是必选项。  其他参数则视客户签名情况而定。注:DATE时间和OSS服务器时间正负不能超过15分钟,否则OSS服务器返回403。 最后,26NBxoKdsyly4EDv6inkoDft/yA= 这个是签名最终计算结果,与OSS API 文档计算一致。 注:DATE格式必须是http1.1 协议规定的GMT时间格式 可以参考api文档:点击查看如问题还未解决,请联系售后技术支持。

2019-12-01 23:31:50 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 用户可以在 HTTP 请求中增加 Authorization(授权)的 Head 来包含签名 (Signature)信息,表明这个消息已被授权。  Authorization 字段计算方法如下: "Authorization: OSS " + Access Key Id + ":" + Signature Signature = base64(hmac-sha1(VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + DATE + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource)) CONTENT-MD5    //表示请求内容数据的 MD5 值 CONTENT-TYPE   //表示请求内容的类型 DATE 表示此次操作的时间,且必须为 HTTP1.1 中支持的 GMT 格式 CanonicalizedOSSHeaders    //表示 http 中的 object meta 组合CanonicalizedResource        //表示用户想要访问的 OSS 资源  验证方法如下:>>> import base64,hmac,sha>>> base64.encodestring(hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV","PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM=\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-oss-magic:abracadabra\nx-oss-meta-author:foo@bar.com\n/oss-example/nelson",sha).digest()).strip(), '26NBxoKdsyly4EDv6inkoDft/yA='('26NBxoKdsyly4EDv6inkoDft/yA=', '26NBxoKdsyly4EDv6inkoDft/yA=‘)>>>  首先,在python环境下import base64,hmac,sha 其次,输入签名参数。  OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV 这个是key secret,测试过程需要替换成客户的key secret。Thu, 17 Nov 2005 18:49:58 GMT 和 /oss-example/nelson 分别是DATE和CanonicalizedResource,这两个是必选项。  其他参数则视客户签名情况而定。注:DATE时间和OSS服务器时间正负不能超过15分钟,否则OSS服务器返回403。 最后,26NBxoKdsyly4EDv6inkoDft/yA= 这个是签名最终计算结果,与OSS API 文档计算一致。 注:DATE格式必须是http1.1 协议规定的GMT时间格式 可以参考api文档:点击查看如问题还未解决,请联系售后技术支持。

2019-12-01 23:31:50 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 用户可以在 HTTP 请求中增加 Authorization(授权)的 Head 来包含签名 (Signature)信息,表明这个消息已被授权。  Authorization 字段计算方法如下: "Authorization: OSS " + Access Key Id + ":" + Signature Signature = base64(hmac-sha1(VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + DATE + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource)) CONTENT-MD5    //表示请求内容数据的 MD5 值 CONTENT-TYPE   //表示请求内容的类型 DATE 表示此次操作的时间,且必须为 HTTP1.1 中支持的 GMT 格式 CanonicalizedOSSHeaders    //表示 http 中的 object meta 组合CanonicalizedResource        //表示用户想要访问的 OSS 资源  验证方法如下:>>> import base64,hmac,sha>>> base64.encodestring(hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV","PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM=\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-oss-magic:abracadabra\nx-oss-meta-author:foo@bar.com\n/oss-example/nelson",sha).digest()).strip(), '26NBxoKdsyly4EDv6inkoDft/yA='('26NBxoKdsyly4EDv6inkoDft/yA=', '26NBxoKdsyly4EDv6inkoDft/yA=‘)>>>  首先,在python环境下import base64,hmac,sha 其次,输入签名参数。  OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV 这个是key secret,测试过程需要替换成客户的key secret。Thu, 17 Nov 2005 18:49:58 GMT 和 /oss-example/nelson 分别是DATE和CanonicalizedResource,这两个是必选项。  其他参数则视客户签名情况而定。注:DATE时间和OSS服务器时间正负不能超过15分钟,否则OSS服务器返回403。 最后,26NBxoKdsyly4EDv6inkoDft/yA= 这个是签名最终计算结果,与OSS API 文档计算一致。 注:DATE格式必须是http1.1 协议规定的GMT时间格式 可以参考api文档:点击查看如问题还未解决,请联系售后技术支持。

2019-12-01 23:31:49 0 浏览量 回答数 0

回答

熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来。 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令行窗口 关闭命令行窗口的快捷键如下: Ctrl + d 进入python环境 在命令行中直接输入python即进入了python的编辑环境。进入环境后最明显的提示是:光标由~$变成>>>。 退出python环境 使用ctrl +d的方式退出python环境。回到命令行环境。 在python环境中输入多行函数 在python环境中,回车是输入结束并执行语句。在输入多行函数的情况下,输入一行后回车则直接运行了某句代码而不是整个函数块。因此,需要能够换行但不结束输入的方法。 在语句的末尾输入英文的;即可实现换行。 例如: def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1);\ return tf.Variable(initial);\注意:输入函数块时注意缩进,否者会报出IndentationError: unexpected indent python错误。 输入中文字符导致non-ascii character xe5 in file解决方法 原因:程序中的编码错误,python默认支持acii模式,但不支持utf8,因此,程序中的中文注释会引发Error。 解决方法:源代码文件第一行添加#coding:utf-8即可避免。

世事皆空 2019-12-02 01:07:01 0 浏览量 回答数 0

回答

Python设置环境变量的具体方法:在系统变量里找到PATH,双击PATH,在结尾加上 ";C:Python25"(不要引号)确定即可。接下来:运行->cmd,在命令行窗口中输入python,即可运行。在命令行窗口中输入python文章中Python设置环境变量的分类:Python编程 FileName:setDbgServerBridge.py import os path=os.environ["HOME"] + "/lib" if os.path.exists(path)==False : os.makedirs(path) 以上就是对Python设置环境变量的具体方法。

元芳啊 2019-12-02 01:04:40 0 浏览量 回答数 0

回答

一、文件的打开和创建 ? 12345 f = open('/tmp/test.txt')f.read()'hello python!nhello world!n'f 二、文件的读取步骤:打开 -- 读取 -- 关闭 ? 1234 f = open('/tmp/test.txt')f.read() 'hello python!nhello world!n' f.close() 读取数据是后期数据处理的必要步骤。.txt是广泛使用的数据文件格式。一些.csv, .xlsx等文件可以转换为.txt 文件进行读取。我常使用的是Python自带的I/O接口,将数据读取进来存放在list中,然后再用numpy科学计算包将list的数据转换为array格式,从而可以像MATLAB一样进行科学计算。 下面是一段常用的读取txt文件代码,可以用在大多数的txt文件读取中 ? 12345678910111213141516 filename = 'array_reflection_2D_TM_vertical_normE_center.txt' # txt文件和当前脚本在同一目录下,所以不用写具体路径pos = []Efield = []with open(filename, 'r') as file_to_read: while True: lines = file_to_read.readline() # 整行读取数据 if not lines: break pass p_tmp, E_tmp = [float(i) for i in lines.split()] # 将整行数据分割处理,如果分割符是空格,括号里就不用传入参数,如果是逗号, 则传入‘,'字符。 pos.append(p_tmp) # 添加新读取的数据 Efield.append(E_tmp) pass pos = np.array(pos) # 将数据从list类型转换为array类型。 Efield = np.array(Efield) pass 例如下面是将要读入的txt文件 2016626171647895.png (429×301) 经过读取后,在Enthought Canopy的variable window查看读入的数据, 左侧为pos,右侧为Efield。 2016626171713978.png (148×277)2016626171743777.png (147×280) 三、文件写入(慎重,小心别清空原本的文件)步骤:打开 -- 写入 -- (保存)关闭 直接的写入数据是不行的,因为默认打开的是'r' 只读模式 ? 123456 f.write('hello boy')Traceback (most recent call last): File "", line 1, in IOError: File not open for writing f 应该先指定可写的模式 ? 12 f1 = open('/tmp/test.txt','w')f1.write('hello boy!') 但此时数据只写到了缓存中,并未保存到文件,而且从下面的输出可以看到,原先里面的配置被清空了 ? 12 [root@node1 ~]# cat /tmp/test.txt[root@node1 ~]# 关闭这个文件即可将缓存中的数据写入到文件中 ? 123 f1.close() [root@node1 ~]# cat /tmp/test.txt[root@node1 ~]# hello boy! 注意:这一步需要相当慎重,因为如果编辑的文件存在的话,这一步操作会先清空这个文件再重新写入。那么如果不要清空文件再写入该如何做呢? 使用r+ 模式不会先清空,但是会替换掉原先的文件,如下面的例子:hello boy! 被替换成hello aay! ? 12345 f2 = open('/tmp/test.txt','r+')f2.write('nhello aa!')f2.close() [root@node1 python]# cat /tmp/test.txthello aay! 如何实现不替换? ? 12345678 f2 = open('/tmp/test.txt','r+')f2.read() 'hello girl!' f2.write('nhello boy!')f2.close() [root@node1 python]# cat /tmp/test.txthello girl!hello boy! 可以看到,如果在写之前先读取一下文件,再进行写入,则写入的数据会添加到文件末尾而不会替换掉原先的文件。这是因为指针引起的,r+ 模式的指针默认是在文件的开头,如果直接写入,则会覆盖源文件,通过read() 读取文件后,指针会移到文件的末尾,再写入数据就不会有问题了。这里也可以使用a 模式 ? 12345678 f = open('/tmp/test.txt','a')f.write('nhello man!')f.close() [root@node1 python]# cat /tmp/test.txthello girl!hello boy!hello man! 关于其他模式的介绍,见下表: 2016626170852899.png (713×317) 文件对象的方法:f.readline() 逐行读取数据 方法一: ? 123456789 f = open('/tmp/test.txt')f.readline() 'hello girl!n' f.readline() 'hello boy!n' f.readline() 'hello man!' f.readline() '' 方法二: ? 123456789101112 for i in open('/tmp/test.txt'): ... print i...hello girl!hello boy!hello man!f.readlines() 将文件内容以列表的形式存放 f = open('/tmp/test.txt')f.readlines() ['hello girl!n', 'hello boy!n', 'hello man!'] f.close() f.next() 逐行读取数据,和f.readline() 相似,唯一不同的是,f.readline() 读取到最后如果没有数据会返回空,而f.next() 没读取到数据则会报错 ? 12345678910111213141516 f = open('/tmp/test.txt')f.readlines() ['hello girl!n', 'hello boy!n', 'hello man!'] f.close() f = open('/tmp/test.txt')f.next() 'hello girl!n' f.next() 'hello boy!n' f.next() 'hello man!' f.next() Traceback (most recent call last):File "", line 1, in StopIteration f.writelines() 多行写入 ? 1234567891011 l = ['nhello dear!','nhello son!','nhello baby!n']f = open('/tmp/test.txt','a')f.writelines(l)f.close() [root@node1 python]# cat /tmp/test.txthello girl!hello boy!hello man!hello dear!hello son!hello baby! f.seek(偏移量,选项) ? 12345678910111213141516 f = open('/tmp/test.txt','r+')f.readline() 'hello girl!n' f.readline() 'hello boy!n' f.readline() 'hello man!n' f.readline() ' ' f.close()f = open('/tmp/test.txt','r+')f.read() 'hello girl!nhello boy!nhello man!n' f.readline() '' f.close() 这个例子可以充分的解释前面使用r+这个模式的时候,为什么需要执行f.read()之后才能正常插入f.seek(偏移量,选项)(1)选项=0,表示将文件指针指向从文件头部到“偏移量”字节处 (2)选项=1,表示将文件指针指向从文件的当前位置,向后移动“偏移量”字节 (3)选项=2,表示将文件指针指向从文件的尾部,向前移动“偏移量”字节 偏移量:正数表示向右偏移,负数表示向左偏移 ? 12345678910111213 f = open('/tmp/test.txt','r+')f.seek(0,2)f.readline() '' f.seek(0,0)f.readline() 'hello girl!n' f.readline() 'hello boy!n' f.readline() 'hello man!n' f.readline() '' f.flush() 将修改写入到文件中(无需关闭文件) ? 12 f.write('hello python!')f.flush() ? 1 [root@node1 python]# cat /tmp/test.txt ? 1234 hello girl!hello boy!hello man!hello python! f.tell() 获取指针位置 ? 123456789 f = open('/tmp/test.txt')f.readline() 'hello girl!n' f.tell() 12 f.readline() 'hello boy!n' f.tell() 23 四、内容查找和替换1、内容查找实例:统计文件中hello个数 思路:打开文件,遍历文件内容,通过正则表达式匹配关键字,统计匹配个数。 ? 1 [root@node1 ~]# cat /tmp/test.txt ? 1234 hello girl!hello boy!hello man!hello python! 脚本如下: 方法一: ? 12345678910 !/usr/bin/python import ref = open('/tmp/test.txt')source = f.read()f.close()r = r'hello's = len(re.findall(r,source))print s[root@node1 python]# python count.py4 方法二: ? 123456789101112 !/usr/bin/python import refp = file("/tmp/test.txt",'r')count = 0for s in fp.readlines():li = re.findall("hello",s)if len(li)>0:count = count + len(li)print "Search",count, "hello"fp.close()[root@node1 python]# python count1.pySearch 4 hello 2、替换实例:把test.txt 中的hello全部换为"hi",并把结果保存到myhello.txt中。 ? 1234567891011121314 !/usr/bin/python import ref1 = open('/tmp/test.txt')f2 = open('/tmp/myhello.txt','r+')for s in f1.readlines():f2.write(s.replace('hello','hi'))f1.close()f2.close()[root@node1 python]# touch /tmp/myhello.txt[root@node1 ~]# cat /tmp/myhello.txthi girl!hi boy!hi man!hi python! 实例:读取文件test.txt内容,去除空行和注释行后,以行为单位进行排序,并将结果输出为result.txt。test.txt 的内容如下所示: ? 12345678910111213141516171819 some words Sometimes in life,You find a special friend;Someone who changes your life just by being part of it.Someone who makes you laugh until you can't stop;Someone who makes you believe that there really is good in the world.Someone who convinces you that there really is an unlocked door just waiting for you to open it.This is Forever Friendship.when you're down,and the world seems dark and empty,Your forever friend lifts you up in spirits and makes that dark and empty worldsuddenly seem bright and full.Your forever friend gets you through the hard times,the sad times,and the confused times.If you turn and walk away,Your forever friend follows,If you lose you way,Your forever friend guides you and cheers you on.Your forever friend holds your hand and tells you that everything is going to be okay. 脚本如下: ? 12345678910 f = open('cdays-4-test.txt')result = list()for line in f.readlines(): # 逐行读取数据line = line.strip() #去掉每行头尾空白if not len(line) or line.startswith('#'): # 判断是否是空行或注释行continue #是的话,跳过不处理result.append(line) #保存result.sort() #排序结果print resultopen('cdays-4-result.txt','w').write('%s' % 'n'.join(result))

xuning715 2019-12-02 01:10:18 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SSL证书 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 2020中国云原生 阿里云云栖号