对于在Python中进行AND/OR?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍在python中进行中文处理的库只有一个,并为您提供关于Python-如何在Python中进行相对导入?、使
对于在Python中进行AND / OR?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍在python中进行中文处理的库只有一个,并为您提供关于Python-如何在Python中进行相对导入?、使用队列在python中进行线程化、利用Fn.py库在Python中进行函数式编程、在Python中对ALM进行Anova测试的有用信息。
本文目录一览:- 在Python中进行AND / OR?(在python中进行中文处理的库只有一个)
- Python-如何在Python中进行相对导入?
- 使用队列在python中进行线程化
- 利用Fn.py库在Python中进行函数式编程
- 在Python中对ALM进行Anova测试
在Python中进行AND / OR?(在python中进行中文处理的库只有一个)
我知道and
andor
表达式存在于python中,但是有任何and/or
表达式吗?还是通过某种方式组合它们以产生与and/or
表达式相同的效果?
我的代码看起来像这样:
if input=="a": if "a" or "á" or "à" or "ã" or "â" in someList: someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")
这样,我的意思是,如果用户输入“ a”并且任何类型的“ a”都包含在先前定义的列表中,我是否可以从给定列表中删除所有类型的“ a”?
python告诉我在以下方面存在问题:
someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")
他告诉我: ValueError: list.remove(x): x not in list
答案1
小编典典正如Matt Ball的回答所解释的,or
是“和/或”。但or
不适in
用于您上面使用它的方式。你不得不说if "a" in someList or "á" in someListor...
。还是更好
if any(c in someList for c in ("a", "á", "à", "ã", "â")): ...
这就是您所问问题的答案。
其他注意事项
但是,关于您发布的示例代码,还有更多要说的话。首先,someList.remove... or someListremove...
这里的语句链是不必要的,并且可能导致意外的行为。这也很难读!最好将其分成几行:
someList.remove("a")someList.remove("á")...
但是,仅此还不够。正如您所观察到的,如果该项目不在列表中,则将引发错误。最重要的是,使用remove
非常缓慢,因为每次调用它时,Python都必须查看列表中的每个项目。因此,如果要删除10个不同的字符,并且有一个包含100个字符的列表,则必须执行1000个测试。
相反,我建议一种非常不同的方法。使用过滤列表set
,如下所示:
chars_to_remove = set(("a", "á", "à", "ã", "â"))someList = [c for c in someList if c not in chars_to_remove]
或者,就地更改列表而不创建副本:
someList[:] = (c for c in someList if c not in chars_to_remove)
它们都使用列表理解语法来创建新列表。他们查看中的每个字符someList
,检查其中的字符chars_to_remove
,如果不是,则将字符包括在新列表中。
这是此代码的最有效版本。它具有两个速度优势:
- 它只通过
someList
一次。在上述情况下,它没有执行1000个测试,而是仅执行100个。 - 它可以用一个操作测试所有的字符,因为
chars_to_remove
是一个set
。如果它chars_to_remove
是list
或tuple
,那么在上述情况下每个测试实际上将是10个测试-因为列表中的每个字符都需要单独检查。
Python-如何在Python中进行相对导入?
想象一下这个目录结构:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
我正在编码mod1
,我需要从中导入一些东西mod2
。我该怎么办?
我尝试过,from ..sub2 import mod2
但是得到了“未打包的相对导入尝试”。
我四处搜寻,但只发现"sys.path manipulation"
骇客。有没有一种干净的方法?
使用队列在python中进行线程化
我想在python中使用线程下载大量网页,并通过以下代码在网站之一中使用队列。
它放置了一个无限的while循环。是否每个线程都连续运行,直到所有线程完成才结束?我错过了什么吗?
#!/usr/bin/env pythonimport Queueimport threadingimport urllib2import timehosts = ["http://yahoo.com", "http://google.com", "http://amazon.com","http://ibm.com", "http://apple.com"]queue = Queue.Queue()class ThreadUrl(threading.Thread): """Threaded Url Grab""" def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: #grabs host from queue host = self.queue.get() #grabs urls of hosts and prints first 1024 bytes of page url = urllib2.urlopen(host) print url.read(1024) #signals to queue job is done self.queue.task_done()start = time.time()def main(): #spawn a pool of threads, and pass them queue instance for i in range(5): t = ThreadUrl(queue) t.setDaemon(True) t.start() #populate queue with data for host in hosts: queue.put(host) #wait on the queue until everything has been processed queue.join()main()print "Elapsed Time: %s" % (time.time() - start)
答案1
小编典典将线程设置为daemon
线程会使线程在主线程完成后退出。但是,是的,您是正确的,只要线程中的某些queue
内容将阻塞,线程将连续运行。
该文档解释了此详细信息Queue docs
python Threading文档也对此daemon
部分进行了说明。
当没有活动的非守护线程时,整个Python程序将退出。
因此,当队列为空并且queue.join
解释器退出时恢复运行时,线程将死亡。
编辑:的默认行为的更正 Queue
利用Fn.py库在Python中进行函数式编程
尽管
- 形式上可证
- 模块性
- 组合性
- 易于调试及测试
虽然这份列表已经描述得够清楚了,但我还是很喜欢Michael O.Church在他的文章“函数式程序极少腐坏(Functional programs rarely rot)”中对函数式编程的优点所作的描述。我在PyCon UA 2012期间的讲座“Functional Programming with Python”中谈论了在Python中使用函数式方式的内容。我也提到,在你尝试在Python中编写可读同时又可维护的函数式代码时,你会很快发现诸多问题。
fn.py类库就是为了应对这些问题而诞生的。尽管它不可能解决所有问题,但对于希望从函数式编程方式中获取最大价值的开发者而言,它是一块“电池”,即使是在命令式方式占主导地位的程序中,也能够发挥作用。那么,它里面都有些什么呢?
Scala风格的Lambda定义
在Python中创建Lambda函数的语法非常冗长,来比较一下:
Python
map(lambda x: x*2, [1,2,3])
Scala
立即学习“Python免费学习笔记(深入)”;
点击下载“修复打印机驱动工具”;
代码如下:
List(1,2,3).map(_*2)
Clojure
代码如下:
(map #(* % 2) ''(1 2 3))
Haskell
代码如下:
map (2*) [1,2,3]
受Scala的启发,Fn.py提供了一个特别的_对象以简化Lambda语法。
from fn import _ assert (_ + _)(10, 5) = 15 assert list(map(_ * 2, range(5))) == [0,2,4,6,8] assert list(filter(_ < 10, [9,10,11])) == [9]
除此之外还有许多场景可以使用_:所有的算术操作、属性解析、方法调用及分片算法。如果你不确定你的函数具体会做些什么,你可以将结果打印出来:
from fn import _ print (_ + 2) # "(x1) => (x1 + 2)" print (_ + _ * _) # "(x1, x2, x3) => (x1 + (x2 * x3))"
流(Stream)及无限序列的声明
Scala风格的惰性求值(Lazy-evaluated)流。其基本思路是:对每个新元素“按需”取值,并在所创建的全部迭代中共享计算出的元素值。Stream对象支持<<操作符,代表在需要时将新元素推入其中。
惰性求值流对无限序列的处理是一个强大的抽象。我们来看看在函数式编程语言中如何计算一个斐波那契序列。
Haskell
代码如下:
Clojure
代码如下:
Scala
立即学习“Python免费学习笔记(深入)”;
点击下载“修复打印机驱动工具”;
代码如下:
0 #:: 1 #:: fibs.zip(fibs.tail).map{case (a,b) => a + b}
现在你可以在Python中使用同样的方式了:
from fn import Stream from fn.iters import take, drop, map from operator import add f = Stream() fib = f << [0, 1] << map(add, f, drop(1, f)) assert list(take(10, fib)) == [0,1,1,2,3,5,8,13,21,34] assert fib[20] == 6765 assert list(fib[30:35]) == [832040,1346269,2178309,3524578,5702887]
蹦床(Trampolines)修饰符
fn.recur.tco是一个不需要大量栈空间分配就可以处理TCO的临时方案。让我们先从一个递归阶乘计算示例开始:
def fact(n): if n == 0: return 1 return n * fact(n-1)
这种方式也能工作,但实现非常糟糕。为什么呢?因为它会递归式地保存之前的计算值以算出最终结果,因此消耗了大量的存储空间。如果你对一个很大的n值(超过了sys.getrecursionlimit()的值)执行这个函数,CPython就会以此方式失败中止:
>>> import sys >>> fact(sys.getrecursionlimit() * 2) ... many many lines of stacktrace ... RuntimeError: maximum recursion depth exceeded
这也是件好事,至少它避免了在你的代码中产生严重错误。
我们如何优化这个方案呢?答案很简单,只需改变函数以使用尾递归即可:
def fact(n, acc=1): if n == 0: return acc return fact(n-1, acc*n)
为什么这种方式更佳呢?因为你不需要保留之前的值以计算出最终结果。可以在Wikipedia上查看更多尾递归调用优化的内容。可是……Python的解释器会用和之前函数相同的方式执行这段函数,结果是你没得到任何优化。
fn.recur.tco为你提供了一种机制,使你可以使用“蹦床”方式获得一定的尾递归优化。同样的方式也使用在诸如Clojure语言中,主要思路是将函数调用序列转换为while循环。
from fn import recur @recur.tco def fact(n, acc=1): if n == 0: return False, acc return True, (n-1, acc*n)
@recur.tco是一个修饰符,能将你的函数执行转为while循环并检验其输出内容:
- (False, result)代表运行完毕
- (True, args, kwargs)代表我们要继续调用函数并传递不同的参数
- (func, args, kwargs)代表在while循环中切换要执行的函数
函数式风格的错误处理
假设你有一个Request类,可以按照传入其中的参数名称得到对应的值。要想让其返回值格式为全大写、非空并且去除头尾空格的字符串,你需要这样写:
class Request(dict): def parameter(self, name): return self.get(name, None) r = Request(testing="Fixed", empty=" ") param = r.parameter("testing") if param is None: fixed = "" else: param = param.strip() if len(param) == 0: fixed = "" else: fixed = param.upper()
额,看上去有些古怪。用fn.monad.Option来修改你的代码吧,它代表了可选值,每个Option实例可代表一个Full或者Empty(这点也受到了Scala中Option的启发)。它为你编写长运算序列提供了简便的方法,并且去掉除了许多if/else语句块。
from operator import methodcaller from fn.monad import optionable class Request(dict): @optionable def parameter(self, name): return self.get(name, None) r = Request(testing="Fixed", empty=" ") fixed = r.parameter("testing") .map(methodcaller("strip")) .filter(len) .map(methodcaller("upper")) .get_or("")
fn.monad.Option.or_call是个便利的方法,它允许你进行多次调用尝试以完成计算。例如,你有一个Request类,它有type,mimetype和url等几个可选属性,你需要使用最少一个属性值以分析它的“request类型”:
from fn.monad import Option request = dict(url="face.png", mimetype="PNG") tp = Option \ .from_value(request.get("type", None)) \ # check "type" key first .or_call(from_mimetype, request) \ # or.. check "mimetype" key .or_call(from_extension, request) \ # or... get "url" and check extension .get_or("application/undefined")
其余事项?
我仅仅描述了类库的一小部分,你还能够找到并使用以下功能:
- 22个附加的itertools代码段,以扩展内置module的功能的附加功能
- 将Python 2和Python 3的迭代器(iterator)(如range,map及filtter等等)使用进行了统一,这对使用跨版本的类库时非常有用
- 为函数式组合及partial函数应用提供了简便的语法
- 为使用高阶函数(apply,flip等等)提供了附加的操作符
正在进行中的工作
自从在Github上发布这个类库以来,我从社区中收到了许多审校观点、意见和建议,以及补丁和修复。我也在继续增强现有功能,并提供新的特性。近期的路线图包括以下内容:
- 为使用可迭代对象(iterable),如foldl,foldr增加更多操作符
- 更多的monad,如fn.monad.Either,以处理错误记录
- 为大多数module提供C-accelerator
- 为简化lambda arg1: lambda arg2:…形式而提供的curry函数的生成器
- 更多文档,更多测试,更多示例代码
在Python中对ALM进行Anova测试
我正在尝试获取GLM中每个协变量的F统计量和p值。在Python中,我使用stats mode.formula.api进行GLM。
formula = ''PropNo_Pred ~ Geography + log10BMI + Cat_OpCavity + CatLes_neles + CatRural_urban + \ CatPred_Control + CatNative_Intro + Midpoint_of_study''mod1 = smf.glm(formula=formula, data=A2, family=sm.families.Binomial()).fit()mod1.summary()
之后,我尝试使用statsmodels.stats中的方差分析对此模型进行ANOVA测试
table1 = anova_lm(mod3)print table1
但是我收到一个错误消息:’GLMResults’对象没有属性’ssr’
看起来这个anova_lm函数仅适用于线性模型,python中是否有一个模块可以对GLM进行anova测试?
答案1
小编典典不幸的是,没有。但是,您可以通过在每个术语上使用模型的假设检验方法来滚动自己的模型。实际上,他们的一些ANOVA方法甚至都没有使用属性ssr
(这是模型的残差平方和,因此对于二项式GLM显然是不确定的)。您可能可以修改此代码以执行GLM
ANOVA。
今天关于在Python中进行AND / OR?和在python中进行中文处理的库只有一个的分享就到这里,希望大家有所收获,若想了解更多关于Python-如何在Python中进行相对导入?、使用队列在python中进行线程化、利用Fn.py库在Python中进行函数式编程、在Python中对ALM进行Anova测试等相关知识,可以在本站进行查询。
本文标签: