t在python中的用法 int在python中的用法
python中括号可以换成小括号
否则,它返回false。python生成器是用来代替"不一定能够使用全部元素的数组",等到使用某一元素时,才生成该元素,用来节省空间.
t在python中的用法 int在python中的用法
t在python中的用法 int在python中的用法
x = ['mmm', 'mm', 'mm', 'm' ]
种:(数组生成式的中括号变成小括号)
# 生成器
arr = (x for x in range(1,6))
# 生成器下一个元素用next()来取得
print("--next1--")
print(next(arr))
print("--next2--")
print(next(arr))
print("--next3--")
print(next(arr))
输出结果:
--next1--
1--next2--
2--next3--
3第二种方式: 使用关键字 yield 关键字
# 斐波那契数列生成器
def creatNum():
print("---开始执行生成器方法---")
a,b = 0,1
for i in range(0,5):
print("--step1--")
yield b
print("--step2--")
a,b = b,a+b
print("--step3--")
print("--..stop..--")
print("直接调用方法...")
print(creatNum())
func = creatNum()
#一次生成
print("使用next调用")
x = next(f调用timeit.Timer对象的timeit()方法时,首先将执行构造子的第二个参数(如果有), 之后执行构造子的个参数并对其执行时间进行计时。timeit.Timer.timeit()方法的返回值是以秒计数的时间,类型是float。默认情况下,timeit()方法重复100万次,并返回所 有这些执行的总秒数,但在这一特定案例中,只需要1000次反复就可以给出有用的结果, 因此对重复计数次数进行了显式指定。在对每个函数进行计时后,使用重复次数对总数进行除法作,就得到了平均执行时间,并在控制台中打印出函数名与执行时间。unc)
print(x)
#又一次生成
print("使用next调用")
x = next(func)
print(x)
print("使用next调用")
x = next(func)
print(x)
输出结果:
直接调用方法...
使用next调用
--step1--
--step2--
--step3--
--step1--
--step2--
--step3--
--step1--
2生成器还可以用 生成器.next 来调用,等价于 next(生成器)
如果使用next来调用,调用到生成器执行完毕,就会崩掉. 我们基本不会使用next来执行生成器
一般来说会用for循环来执行生成器:
# 斐波那契数列生成器
def creatNum():
print("---开始执行生成器方法---")
a,b = 0,1
for i in range(0,5):
print("--step1--")
yield b
print("--step2--")
a,b = b,a+b
print("--step3--")
print("--..stop..--")
print("直接调用方法...")
print(creatNum())
func = creatNum()
#使用for循环来执行生成器
for i in func:
print(i)
输出结果: (执行完毕不会崩溃)
直接调用方法...
--step1--
1--step2--
--step3--
--step1--
1--step2--
--step3--
--step1--
2--step2--
--step3--
--step1--
3--step2--
--step3--
--step1--
5--step2--
--step3--
--..stop..--
在执行生成器时,可以使用 生成器.send(param) 方法
send方法不光是执行一步next作,还会把send里面的参数传到生成器中充当yield表达式的返回值
(注意:次执行,send里面的参数应该为None,或者使用next方法)
i = 0
while i < 5:
temp = yield i
print(temp)
i += 1
t = test()
#先使用next执行,看能出来什么结果
t.__next__()
t.__next__()
print(t.__next__())
t.send("1231231231223123")
print(t.send("hahahahhahaha"))
输出结果: (可见next输出temp为none , 而send 则把值传递进了生成器)
21231231231223123
hahahahhahaha
4
后端编程Python3-调试、测试和性能剖析(下)
单元测试(Unit Testing)
为程序编写测试——如果做的到位——有助于减少bug的出现,并可以提高我们对程序按预期目标运行的信心。通常,测试并不能保证正确性,因为对大多数程序而言, 可能的输入范围以及可能的计算范围是如此之大,只有其中最小的一部分能被实际地进 行测试。尽管如此,通过仔细地选择测试的方法和目标,可以提高代码的质量。
大量不同类型的测试都可以进行,比如可用性测试、功能测试以及整合测试等。这里, 我们只讲单元测试一对单独的函数、类与方法进行测试,确保其符合预期的行为。
TDD的一个关键点是,当我们想添加一个功能时——比如为类添加一个方法—— 我们首次为其编写一个测试用例。当然,测试将失败,因为我们还没有实际编写该方法。现在,我们编写该方法,一旦方法通过了测试,就可以返回所有测试,确保我们新添加的代码没有任何预期外的副作用。一旦所有测试运行完毕(包括我们为新功能编写的测试),就可以对我们的代码进行检查,并有理有据地相信程序行为符合我们的期望——当然,前提是我们的测试是适当的。
比如,我们编写了一个函数,该函数在特定的索引位置插入一个字符串,可以像下面这样开始我们的TDD:
"""Returns a copy of string with insert inserted at the ition
>>> string = "ABCDE"
>>> result =[]
>>> for i in range(-2, len(string) + 2):
... result.append(insert_at(string, i,“-”))
>>> result[:5]
['ABC-DE', 'ABCD-E', '-ABCDE','A-BCDE', 'AB-CDE']
['ABC-DE', 'ABCD-E', 'ABCDE-', 'ABCDE-']
"""
return string
对不返回任何参数的函数或方法(通常返回None),我们通常赋予其由pass构成的一个suite,对那些返回值被试用的,我们或者返回一个常数(比如0),或者某个不变的参数——这也是我们这里所做的。(在更复杂的情况下,返回fake对象可能更有用一一对这样的类,提供mock对象的第三方模块是可用的。)
运行doctest时会失败,并列出每个预期内的字符串('ABCD-EF'、'ABCDE-F' 等),及其实际获取的字符串(所有的都是'ABCD-EF')。一旦确定doctest是充分的和正确的,就可以编写该函数的主体部分,在本例中只是简单的return string[:ition] + insert+string[ition:]。(如果我们编写的是 return string[:ition] + insert,之后 string [:ition]并将其粘贴在末尾以便减少一些输入作,那么doctest会立即提示错误。)
Python的标准库提供了两个单元测试模块,一个是doctest,这里和前面都简单地提到过,另一个是unittest。此外,还有一些可用于Python的第三方测试工具。其中最的两个是nose ()与py.test (), nose 致力于提供比标准的unittest 模块更广泛的功能,同时保持与该模块的兼容性,py.test则采用了与unittest有些不同的方法,试图尽可能消除样板测试代码。这两个第三方模块都支持测试发现,因此没必要写一个总体的测试程序——因为模块将自己搜索测试程序。这使得测试整个代码树或某一部分 (比如那些已经起作用的模块)变得很容易。那些对测试关切的人,在决定使用哪个测试工具之前,对这两个(以及任何其他有吸引力的)第三方模块进行研究都是值 得的。
创建doctest是直截了当的:我们在模块中编写测试、函数、类与方法的docstrings。 对于模块,我们简单地在末尾添加了 3行:
if __name__ =="__main__":
import doctest
在程序内部使用doctest也是可能的。比如,blocks.py程序(其模块在后面)有自己函数的doctest,但以如下代码结尾:
if __name__== "__main__":
main()
这里简单地调用了程序的main()函数,并且没有执行程序的doctest。要实验程序的 doctest,有两种方法。一种是导入doctest模块,之后运行程序---比如,在控制台中输 入 python3 -m doctest blocks.py (在 Wndows 平台上,使用类似于 C:Python3 lpython.exe 这样的形式替代python3)。如果所有测试运行良好,就没有输出,因此,我们可能宁愿执行python3-m doctest blocks.py-v,因为这会列出每个执行的doctest,并在给出结果摘要。
另一种执行doctest的方法是使用unittest模块创建单独的测试程序。在概念上, unittest模块是根据Ja的JUnit单元测试库进行建模的,并用于创建包含测试用例的测试套件。unittest模块可以基于doctests创建测试用例,而不需要知道程序或模块包含的任何事物——只要知道其包含doctest即可。因此,为给blocks.py程序制作一个测试套件,我们可以创建如下的简单程序(将其称为test_blocks.py):
import doctest
import unittest
import blocks
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(blocks))
runner = unittest.TextTestRunner()
print(runner.run(suite))
注意,如果釆用这种方法,程序的名称上会有一个隐含的约束:程序名必须是有效的模块名。因此,名为convert-incidents.py的程序的测试不能写成这样。因为import convert-incidents不是有效的,在Python标识符中,连接符是无效的(避开这一约束是可能的,但最简单的解决方案是使用总是有效模块名的程序文件名,比如,使用下划线替换连接符)。这里展示的结构(创建一个测试套件,添加一个或多个测试用例或测试套件,运行总体的测试套件,输出结果)是典型的机遇unittest的测试。运行时,这一特定实例产生如下结果:
...
.............................................................................................................
Ran 3 tests in 0.244s
OK
每次执行一个测试用例时,都会输出一个句点(因此上面的输出最前面有3个句点),之后是一行连接符,再之后是测试摘要(如果有任何一个测试失败,就会有更多的输出信息)。
如果我们尝试将测试分离开(典型情况下是要测试的每个程序和模块都有一个测试用例),就不要再使用doctests,而是直接使用unittest模块的功能——尤其是我们习惯于使用JUnit方法进行测试时ounittest模块会将测试分离于代码——对大型项目(测试编写人员与开发人员可能不一致)而言,这种方法特别有用。此外,unittest单元测试编写为的Python模块,因此,不会像在docstring内部编写测试用例时受到兼容性和明智性的限制。
unittest模块定义了 4个关键概念。测试夹具是一个用于描述创建测试(以及用完之后将其清理)所必需的代码的术语,典型实例是创建测试所用的一个输入文件,删除输入文件与结果输出文件。测试套件是一组测试用例的组合。测试用例是测试的基本单元—我们很快就会看到实例。测试运行者是执行一个或多个测试套件的对象。
典型情况下,测试套件是通过创建unittest.TestCase的子类实现的,其中每个名称 以“test”开头的方法都是一个测试用例。如果我们需要完成任何创建作,就可以在一个名为setUp()的方法中实现;类似地,对任何清理作,也可以实现一个名为 tearDown()的方法。在测试内部,有大量可供我们使用的unittest.TestCase方法,包括 assertTrue()、assertEqual()、assertAlmostEqual()(对于测试浮点数很有用)、assertRaises() 以及更多,还包括很多对应的逆方法,比如assertFalse()、assertNotEqual()、failIfEqual()、 failUnlessEqual ()等。
unittest模块进行了很好的归档,并且提供了大量功能,但在这里我们只是通过一 个非常简单的测试套件来感受一下该模块的使用。这里将要使用的实例,该练习要求创建一个Atomic模块,该模块可以用作一 个上下文管理器,以确保或者所有改变都应用于某个列表、或字典,或者所有改变都不应用。作为解决方案提供的Atomic.py模块使用30行代码来实现Atomic类, 并提供了 100行左右的模块doctest。这里,我们将创建test_Atomic.py模块,并使用 unittest测试替换doctest,以便可以删除doctest。
在编写测试模块之前,我们需要思考都需要哪些测试。我们需要测试3种不同的数据类型:列表、与字典。对于列表,需要测试的是插入项、删除项或修改项的值。对于,我们必须测试向其中添加或删除一个项。对于字典,我们必须测试的是插入一个项、修改一个项的值、删除一个项。此外,还必须要测试的是在失败的情况下,不会有任何改变实际生效。
结构上看,测试不同数据类型实质上是一样的,因此,我们将只为测试列表编写测试用例,而将其他的留作练习。test_Atomic.py模块必须导入unittest模块与要进行测试的Atomic模块。
创建unittest文件时,我们通常创建的是模块而非程序。在每个模块内部,我们定义一个或多个unittest.TestCase子类。比如,test_Atomic.py模块中仅一个单独的 unittest-TestCase子类,也就是TestAtomic (稍后将对其进行讲解),并以如下两行结束:
if name == "__main__":
unittest.main()
这两行使得该模块可以单独运行。当然,该模块也可以被导入并从其他测试程序中运行——如果这只是多个测试套件中的一个,这一点是有意义的。
如果想要从其他测试程序中运行test_Atomic.py模块,那么可以编写一个与此类似的程序。我们习惯于使用unittest模块执行doctests,比如:
import unittest
import test_Atomic
suite = unittest.TestLoader().loadTestsFromTestCase(test_Atomic.TestAtomic)
runner = unittest.TextTestRunner()
pnnt(runner.run(suite))
这里,我们已经创建了一个单独的套件,这是通过让unittest模块读取test_Atomic 模块实现的,并且使用其每一个test()方法(本实例中是test_list_success()、test_list_fail(),稍后很快就会看到)作为测试用例。
我们现在将查看TestAtomic类的实现。对通常的子类(不包括unittest.TestCase 子类),不怎么常见的是,没有必要实现初始化程序。在这一案例中,我们将需要建立 一个方法,但不需要清理方法,并且我们将实现两个测试用例。
def setUp(self):
self.original_list = list(range(10))
我们已经使用了 unittest.TestCase.setUp()方法来创建单独的测试数据片段。
def test_list_succeed(self):
s = self.original_list[:]
atomic.append(1999)
atomic.insert(2, -5)
del atomic[5]
atomic[4]= -782
atomic.insert(0, -9)
self.assertEqual(s,
[-9, 0, 1, -5, 2, -782, 5, 6, 7, 8, 9, 1999])
def test_list_fail(self):
s = self.original_list[:]
with self.assertRaises(AttributeError):
atomic.append(1999)
atomic.insert(2, -5)
del atomic[5]
atomic[4] = -782
atomic.poop() # Typo
self.assertListEqual(s, self.original_list)
这里,我们直接在测试方法中编写了测试代码,而不需要一个内部函数,也不再使用unittest.TestCase.assertRaised()作为上下文管理器(期望代码产生AttributeError)。 我们也使用了 Python 3.1 的 unittest.TestCase.assertListEqual()方法。
正如我们已经看到的,Python的测试模块易于使用,并且极为有用,在我们使用 TDD的情况下更是如此。它们还有比这里展示的要多得多的大量功能与特征——比如,跳过测试的能力,这有助于理解平台别——并且这些都有很好的文档支持。缺失的一个功能——但nose与py.test提供了——是测试发现,尽管这一特征被期望在后续的Python版本(或许与Python 3.2—起)中出现。
性能剖析(Profiling)
在深入讨论profiling之前,注意一些易于学习和使用的Python程序设计习惯是有意义的,并且对提高程序性能不无裨益。这些技术都不是特定于某个Python版本的, 而是合理的Python程序设计风格。,在需要只读序列时,使用元组而非列表; 第二,使用生成器,而不是创建大的元组和列表并在其上进行迭代处理;第三,尽量使用Python内置的数据结构 dicts、lists、tuples 而不实现自己的自定义结构,因为内置的数据结构都是经过了高度优化的;第四,从小字符串中产生大字符串时, 不要对小字符串进行连接,而是在列表中累积,将字符串列表结合成为一个单独的字符串;第五,也是一点,如果某个对象(包括函数或方法)需要多次使用属性进行访问(比如访问模块中的某个函数),或从某个数据结构中进行访问,那么较好的做法是创建并使用一个局部变量来访问该对象,以便提供更快的访问速度。
Python标准库提供了两个特别有用的模块,可以辅助调査代码的性能问题。一个是timeit模块——该模块可用于对一小段Python代码进行计时,并可用于诸如对两个或多个特定函数或方法的性能进行比较等场合。另一个是cProfile模块,可用于profile 程序的性能——该模块对调用计数与次数进行了详细分解,以便发现性能瓶颈所在。
为了解timeit模块,我们将查看一些小实例。定有3个函数function_a()、 function_b()、function_c(), 3个函数执行同样的计算,但分别使用不同的算法。如果将这些函数放于同一个模块中(或分别导入),就可以使用timeit模块对其进行运行和比较。下面给出的是模块使用的代码:
if __name__ == "__main__":
repeats = 1000
for function in ("function_a", "function_b", "function_c"):
t = timeit.Timer("{0}(X, Y)".format(function),"from __main__ import {0}, X, Y".format(function))
sec = t.timeit(repeats) / repeats
print("{function}() {sec:.6f} sec".format(locals()))
赋予timeit.Timer()构造子的个参数是我们想要执行并计时的代码,其形式是字符串。这里,该字符串是“function_a(X,Y)”;第二个参数是可选的,还是一个待执行的字符串,这一次是在待计时的代码之前,以便提供一些建立工作。这里,我们从 __main__ (即this)模块导入了待测试的函数,还有两个作为输入数据传入的变量(X 与Y),这两个变量在该模块中是作为全局变量提供的。我们也可以很轻易地像从其他模块中导入数据一样来进行导入作。
function_a() 0.001618 sec
function_b() 0.012786 sec
function_c() 0.003248 sec
在这一实例中,function_a()显然是最快的——至少对于这里使用的输入数据而言。 在有些情况下一一比如输入数据不同会对性能产生巨大影响——可能需要使用多组输入数据对每个函数进行测试,以便覆盖有代表性的测试用例,并对总执行时间或平均执行时间进行比较。
有时自己的代码进行计时并不是很方便,因此timeit模块提供了一种在命令行中对代码执行时间进行计时的途径。比如,要对MyModule.py模块中的函数function_a()进行计时,可以在控制台中输入如下命令:python3 -m timeit -n 1000 -s "from MyModule import function_a, X, Y" "function_a(X, Y)"(与通常所做的一样,对 Windows 环境,我们必须使用类似于C:Python3lpython.exe这样的内容来替换python3)。-m选项用于Python 解释器,使其可以加载指定的模块(这里是timeit),其他选项则由timeit模块进行处理。 -n选项指定了循环计数次数,-s选项指定了要建立,一个参数是要执行和计时的代码。命令完成后,会向控制台中打印运行结果,比如:
1000 loops, best of 3: 1.41 msec per loop
之后我们可以轻易地对其他两个函数进行计时,以便对其进行整体的比较。
cProfile模块(或者profile模块,这里统称为cProfile模块)也可以用于比较函数 与方法的性能。与只是提供原始计时的timeit模块不同的是,cProfile模块地展示 了有什么被调用以及每个调用耗费了多少时间。下面是用于比较与前面一样的3个函数的代码:
if __name__ == "__main__":
for function in ("function_a", "function_b", "function_c"):
我们必须将重复的次数放置在要传递给cProfile.run()函数的代码内部,但不需要做任何创建,因为模块函数会使用内省来寻找需要使用的函数与变量。这里没有使用显式的print()语句,因为默认情况下,cProfile.run()函数会在控制台中打印其输出。下面给出的是所有函数的相关结果(有些无关行被省略,格式也进行了稍许调整,以便与页面适应):
1003 function calls in 1.661 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.003 0.003 1.661 1.661 :1 ( )
1000 1.658 0.002 1.658 0.002 MyModule.py:21 (function_a)
1 0.000 0.000 1.661 1.661 {built-in mod exec}
5132003 function calls in 22.700 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.487 0.487 22.700 22.700 : 1 ( )
1000 0.011 0.000 22.213 0.022 MyModule.py:28(function_b)
5128000 7.048 0.000 7.048 0.000 MyModule.py:29( )
1000 0.00 50.000 0.005 0.000 {built-in mod bisectjeft}
1 0.000 0.000 22.700 22.700 {built-in mod exec}
1000 0.001 0.000 0.001 0.000 {built-in mod len}
1000 15.149 0.015 22.196 0.022 {built-in mod sorted}
5129003 function calls in 12.987 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.205 0.205 12.987 12.987 :l ( )
1000 6.472 0.006 12.782 0.013 MyModule.py:36(function_c)
5128000 6.311 0.000 6.311 0.000 MyModule.py:37( )
ncalls ("调用的次数")列列出了对指定函数(在filename:lineno(function)中列出) 的调用次数。回想一下我们重复了 1000次调用,因此必须将这个次数记住。tottime (“总的时间”)列列出了某个函数中耗费的总时间,但是排除了函数调用的其他函数内部花费的时间。个percall列列出了对函数的每次调用的平均时间(tottime // ncalls)。 cumtime ("累积时间")列出了在函数中耗费的时间,并且包含了函数调用的其他函数内部花费的时间。第二个percall列列出了对函数的每次调用的平均时间,包括其调用的函数耗费的时间。
这种输出信息要比timeit模块的原始计时信息富有启发意义的多。我们立即可以发现,function_b()与function_c()使用了被调用5000次以上的生成器,使得它们的速度至少要比function_a()慢10倍以上。并且,function_b()调用了更多通常意义上的函数,包括调用内置的sorted()函数,这使得其几乎比function_c()还要慢两倍。当然,timeit() 模块提供了足够的信息来查看计时上存在的这些别,但cProfile模块允许我们了解为什么会存在这些别。正如timeit模块允许对代码进行计时而又不需要对其一样,cProfile模块也可以做到这一点。然而,从命令行使用cProfile模块时,我们不能地指定要执行的 是什么——而只是执行给定的程序或模块,并报告所有这些的计时结果。需要使用的 命令行是python3 -m cProfile programOrModule.py,产生的输出信息与前面看到的一 样,下面给出的是输出信息样例,格式上进行了一些调整,并忽略了大多数行:
10272458 function calls (10272457 primitive calls) in 37.718 CPU secs
ncalls tottime percall cumtime percall filename:lineno(function)
10.000 0.000 37.718 37.718 :1 ( )
10.719 0.719 37.717 37.717 :12( )
1000 1.569 0.002 1.569 0.002 :20(function_a)
1000 0.011 0.000 22.560 0.023 :27(function_b)
5128000 7.078 0.000 7.078 0.000 :28( )
1000 6.510 0.007 12.825 0.013 :35(function_c)
5128000 6.316 0.000 6.316 0.000 :36( )
在cProfile术语学中,原始调用指的就是非递归的函数调用。
以这种方式使用cProfile模块对于识别值得进一步研究的区域是有用的。比如,这里 我们可以清晰地看到function_b()需要耗费更长的时间,但是我们怎样获取进一步的详细资料?我们可以使用cProfile.run("function_b()")来替换对function_b()的调用。或者可以保存完全的profile数据并使用pstats模块对其进行分析。要保存profile,就必须对命令行进行稍许修改:python3 -m cProfile -o profileDataFile programOrModule.py。 之后可以对 profile 数据进行分析,比如启动IDLE,导入pstats模块,赋予其已保存的profileDataFile,或者也可以在控制台中交互式地使用pstats。
下面程序员在字符串上使用的最常见的作之一是判断字符串是否包含指定子字符串。而Python以非常易于阅读和易于实现的方式就可以实现此功能,有3种方法可以做到这一点。给出的是一个非常短的控制台会话实例,为使其适合页面展示,进行了适当调整,我们自己的输入则以粗体展示:
$ python3 -m cProfile Tuple 没有的方法:-o profile.dat MyModule.py
$ python3 -m pstats
Welcome to the profile statistics browser.
% read profile.dat
profile.dat% callers function_b
Random listing order was used
List reduced from 44 to 1 due to restriction
Function was called by...
ncalls tottime cumtime
:27(function_b) <- 1000 0.011 22.251 :12( )
profile.dat% callees function_b
Random listing order was used
List reduced from 44 to 1 due to restriction
Function called...
ncalls tottime cumtime
:27(function_b)->
1000 0.005 0.005 built-in mod bisectJeft
1000 0.001 0.001 built-in moddef add(a,b=2): len
1000 1 5.297 22.234 built-in mod sorted
profile.dat% quit
输入可以获取命令列表,后面跟随命令名可以获取该命令的更多信息。比如, stats将列出可以赋予stats命令的参数。还有其他一些可用的工具,可以提供profile数据的图形化展示形式,比如 RunSnakeRun (), 该工具需要依赖于wxPython GUI库。
使用timeit与cProfile模块,我们可以识别出我们自己代码中哪些区域会耗费超过预期的时间;使用cProfile模块,还可以准确算岀时间消耗在哪里。
以上内容部分摘自视频课程 05后端编程Python-19调试、测试和性能调优(下) ,更多实示例请参照视频讲解。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。
求python大神解答 救救孩子吧 明天考试了嘤嘤嘤嘤嘤嘤 这个print里的T,0,6怎么做啊
cProfile.run("for ivalue in ranged 1000): {def insert_at(string, ition, insert):0}(X, Y)".format(function))n在python中怎么用
保存为a.py文件.按F5,你就可以看到程序的运行结果了.这是Python的第二种运行方式.在python中用:
1、"
2、""表示反斜杠()
3、return a+b"t"表示制表符
4、'"'表arr += [数组元素]示双引号
print(r"aa
含义
换行符与其他字符并没有区别由于换行符总是一个字符,所有直接选择除去一个字符的所有字符即可x='abc
新建一个len()函数的使用py,中文编码声明注释:#coding=gbk,函数:len()作用:返回字符串、列表、字典、元组等长度。语法:len(str)。参数:str:要计算的字符串、列表、字典、元组等。返回值:字符串、列表、字典、元组等元素的长度。
Python2.x求助T_T
s=raw_input()
dit={}
foNoner i in s:
if i not in dit.keys():
dit[i]=1
else:
dit[i]=dit[i]+1
print(ddoctest.testm=varod()it)
python中s∧t代表什么
def test(如果要在任意python生成器写法有两种位置插入用 arr.insert(n, 值)):补,返回一个新,包括S和T中的非相同元素。中含有六个作符,分别是S|T、S-T、S&T、S^T代表并、、交、补以及S≤T或ST两种子集关系和包含关系。Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,具有比其他语言更有特色语法结构。
python sort()用法
print "Result of 1 plus 2 is: "Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明:
我们来看看这个例子:一、基本形式
列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的。
x = [4, 6, 2, 1, 7, 9]
x.sort()
print x # [1, 2, 4, 6, 7, 9]
如果需要一个排序好的副本,同时保持原有列表不变,怎么实现呢
x =[4, 6, 2, 1, 7, 9]
y = x[ : ]
y.sort()
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]
注意:y = x[:] 通过分片作将列表x的元素全部拷贝给y,如果简单的把x赋值给y:y = x,y和x还是指向同一个列表,并没有产生新的副本。
另一种获取已排序的列表副本的方法是使用sorted函数:
x =[4, 6, 2, 1, 7, 9]
y = sorted(x)
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]
sorted返回一个有序的副本,并且类型总是列表,如下:
二、自定义比较函数
可以定义自己的比较函数,然后通过参数传递给sort方法:
def comp(x, y):
if x < y:
return 1
elif x > y:
return -1
else:
return 0
nums = [3, 2, 8 ,0 ,#print(subdata[0][0]," ",subdata[0][1]) 1]
nums.sort(comp)
print nums # 降序排序[8, 3, 2, 1, 0]
nums.sort(cmp) # 调用内建函数cmp ,升序排序
print nums # 降序排序[0, 1, 2, 3, 8]
三、可选参数
sort方法还有两个可选参数:key和rrse
1、key在使用时必须提供一个排序过程总调用的函数:
x.sort(key = len)
print x # ['m', 'mm', 'mm', 'mmm']
2、rrse实现降序排序,需要提供一个布尔值:
y = [3, 2, 8 ,0 , 1]
y.sort(rrse = True)
print y #[8, 3, 2, 1, 0]
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python , 方法 sort python sort方法、python魔术方法详解、python实例方法详解、list.sort 使用方法、c list.sort 使用方法,以便于您获取更多的相关知识。
alist.sort(key=lambda x: x[1])
为什么用Python及Python快速入门教程
1使用next调用1 为什么使用Python?
设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.
思路:用shell编程.(Linux通常是bash而Windows是批处理脚本).例如,在Windows上用ping ip 的命令依次测试各个机器并得到控制台输出.由于ping通的时候控制台文本通常是"Reply from ... " 而不通的时候文本是"time out ... " ,所以,在结果中进行字符串查找,即可知道该机器是否连通.
实现:Ja代码如下:
String cmd="cmd.exe ping ";
String ipprefix="192.168.10.";
int begin=101;
int efor fil in files:nd=200;
Process p=null;
for(int i=begin;i p= Runtime.getRuntime().exec(cmd+i); String line = null; BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); while((line = reader.readLine()) != null) {//Handling line , may logs it. }reader.close(); p.destroy(); }这段代码运行得很好,问题是为了运行这段代码,你还需要做一些额外的工作.这些额外的工作包括: 编写一个类文件 编写一个main方法 将之编译成字节代码 由于字节代码不能直接运行,你需要再写个小小的bat或者bash脚本来运行. 当然,用C/C++同样能完成这项工作.但C/C++不是跨平台语言.在这个足够简单的例子中也许看不出C/C++和Ja实现的区别,但在一些更为复杂的场景,比如要将连通与否的信息记录到网络数据库.由于Linux和Windows的网络接口实现方式不同,你不得不写两个函数的版本.用Ja就没有这样的顾虑. 同样的工作用Python实现如下:
import subprocess cmd="cmd.exe" begin=101 end=200 while begin p=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) p.stdin.write("ping 192.168.1."+str(begin)+" ") p.stdin.close() p.wait() print "execution result: %s"%p.stdout.read() 对比Ja,Python的实现更为简洁,你编写的时间更快.你不需要写main函数,并且这个程序保存之后可以直接运行.另外,和Ja一样,Python也是跨平台的. 有经验的C/Ja程序员可能会争论说用C/Ja写会比Python写得快.这个观点见仁见智.我的想法是当你同时掌握Ja和Python之后,你会发现用Python写这类程序的速度会比Ja快上许多.例如作本地文件时你仅需要一行代码而不需要Ja的许多流包装类.各种语言有其天然的适合的应用范围.用Python处理一些简短程序类似与作系统的交互编程工作最省时省力. Python应用场合 足够简单的任务,例如一些shell编程.如果你喜欢用Python设计大型商业网站或者设计复杂的游戏,悉听尊便. 安装完Python之后(我本机的版本是2.5.4),打开IDLE(Python GUI) , 该程序是Python语言解释器,你写的语句能够立即运行.我们写下一句的程序语句:
print "Hello,world!" 并按回车.你就能看到这句被K&R引入到程序世界的名言. 在解释器中选择"File"--"New Window" 或快捷键 Ctrl+N , 打开一个新的编辑器.写下如下语句: raw_input("Press enter key to close this window"); 找到你保存的a.py文件,双击.也可以看到程序结果.Python的程序能够直接运行,对比Ja,这是一个优势. 2.2 化支持 我们换一种方式来问候世界.新建一个编辑器并写如下代码: print "欢迎来到奥运!" raw_input("PrefileNum += 1 #文件编号ss enter key to close this window"); 在你保存代码的时候,Python会提示你是否改变文件的字符集,结果如下: # -- coding: cp936 -- print "欢迎来到奥运!" raw_input("Press enter key to close this window"); 将该字符集改为我们更熟悉的形式: # -- coding: GBK -- print "欢迎来到奥运!" # 使用中文的例子 raw_input("Press enter key to close this window"); 程序一样运行良好. 2.3 方便易用的计算器 用微软附带的计算器来计数实在太麻烦了.打开Python解释器,直接进行计算: a=100.0 b=201.1 c=2343 print (a+b+c)/c2.4 字符串,ASCII和UNICODE 可以如下打印出预定义输出格式的字符串: print """ -h Display this usage message -H hostname Hostname to connect to """ 字符串是怎么访问的?请看这个例子: word="abcdefg" a=word[2] print "a is: "+a b=word[1:3] print "b is: "+b # index 1 and 2 elements of word. c=word[:2] print "c is: "+c # index 0 and 1 elements of word. d=word[0:] print "d is: "+d # All elements of word. e=word[:2]+word[2:] print "e is: "+e # All elements of word. f=word[-1] print "f is: "+f # The last elements of word. g=word[-4:-2] print "g is: "+g # index 3 and 4 elements of word. h=word[-2:] print "h is: "+h # The last two elements. i=word[:-2] print "i is: "+i # Everything except the last two characters l=len(word) print "Length of word is: "+ str(l) 请注意ASCII和UNICODE字符串的区别: print "Input your Chinese name:" s=raw_input("Press enter to be continued"); print "Your name is : " +s; l=len(s) print "Length of your Chinese name in asc codes is:"+str(l); a=unicode(s,"GBK") l=len(a) print "I'm sorry we should use unicode char!Characters number of your Chinese name in unicode is:"+str(l);2.5 使用List 类似Ja里的List,这是一种方便易用的数据类型: word=['a','b','c','d','e','f','g'] a=word[2] print "a is: "+a b=word[1:3] print "b is: " print b # index 1 and 2 elements of word. c=word[:2] print "c is: " print c # index 0 and 1 elements of word. d=word[0:] print "d is: " print d # All elements of word. e=word[:2]+word[2:] print "e is: " print e # All elements of word. f=word[-1] print "f is: " print f # The last elements of word. g=word[-4:-2] print "g is: " print g # index 3 and 4 elements of word. h=word[-2:] print "h is: " print h # The last two elements. i=word[:-2] print "i is: " print i # Everything except the last two characters l=len(word) print "Length of word is: "+ str(l) print "Adds new element" word.append('h') print word2.6 条件和循环语句# Multi-way decision x=int(raw_input("Please enter an integer:")) if x<0: x=0 print "Negative changed to zero" elif x==0: print "Zero" else: print "More" # Loops List a = ['cat', 'window', 'defenestrate'] print x, len(x)2.7 如何定义函数# Define and invoke function. def sum(a,b): func = sum r = func(5,6) print r # Defines function with default argument print r r=add(1,5) print r 并且,介绍一个方便好用的函数: # The range() function a =range(5,10) print a a = range(-2,-7) print a a = range(-7,-2) print a a = range(-2,-11,-3) # The 3rd parameter stands for step print a2.8 文件I/Ospath="D:/download/baa.txt" f=open(spath,"w") # Opens file for writing.Creates this file doesn't exist. f.write("First line 1. ") f.wriines("First line 2.") f.close() f=open(spath,"r") # Opens file for reading for line in f: print line f.close()2.9 异常处理s=raw_input("Input your age:") if s =="": raise Exception("Input must no be empty.") try: i=int(s) except ValueError: print "Could not convert data to an integer." except: print "Unknown exception!" else: # It is useful for code that must be executed if the try clause does not raise an exception print "You are %d" % i," years old" finally: # Clean up action print "Goodbye!"2.10 类和继承class Base: def init(self): self.data = [] def add(self, x): self.data.append(x) def addtw(self, x): self.add(x) self.add(x) # Child extends Base class Child(Base): def plus(self,a,b): oChild =Child() oChild.add("str1") print oChild.plus(2,3)2.11 包机制 每一个.py文件称为一个module,module之间可以互相导入.请参看以下例子: # a.py def add_func(a,b): return a+b# b.py from a import add_func # Also can be : import a print "Import add_func from module a" print add_func(1,2) # If using "import a" , then here should be "a.add_func" module可以定义在包里面.Python定义包的方式稍微有点古怪,设我们有一个parent文件夹,该文件夹有一个child子文件夹.child中有一个module a.py . 如何让Python知道这个文件层次结构?很简单,每个目录都放一个名为_init_.py 的文件.该文件内容可以为空.这个层次结构如下所示: parent --init_.py --child -- init_.py --a.py b.py 那么Python如何找到我们定义的module?在标准包sys中,path属性记录了Python的包路径.你可以将之打印出来: import sys 通常我们可以将module的包路径放到环境变量PYTHONPATH中,该环境变量会自动添加到sys.path属性.另一种方便的方法是编程中直接指定我们的module路径到sys.path 中: import sys sys.path.append('D:download') from parent.child.a import add_func print "Import add_func from module a" print add_func(1,2)总结 你会发现这个教程相当的简单.许多Python特性在代码中以隐含方式提出,这些特性包括:Python不需要显式声明数据类型,关键字说明,字符串函数的解释等等.我认为一个熟练的程序员应该对这些概念相当了解,这样在你挤出宝贵的一小时阅读这篇短短的教程之后,你能够通过已有知识的迁移类比尽快熟悉Python,然后尽快能用它开始编程. 当然,1小时学会Python颇有哗众取宠之嫌.确切的说,编程语言包括语法和标准库.语法相当于武术招式,而标准库应用实践经验则类似于内功,需要长期锻炼.Python学习了Ja的长处,提供了大量极方便易用的标准库供程序员"拿来主义".(这也是Python成功的原因),在开篇我们看到了Python如何调用Windows cmd的例子,以后我会尽量写上各标准库的用法和一些应用技巧,让大家真正掌握Python. 1、Python的数组分三种类型: (1) list 普通的链表,初始化后可以通过特定方法动态增加元素。定义方式:arr = [元素] (2) Tuple 固定的数组,一旦定义后,其元素个数是不能再改变的。定义方式:arr = (元素) (3) Dictionary 词典类型, 即是Hash数组。定义方式:arr = {元素k:v} 2、下面具体说明这些数组的使用方法和技巧: (1) list 链表数组 a、定义时初始化 b、定义时不初始化一维数组: arr = [] 数组: arr = [i for i in range(10), 1,[]] #注意, i for in xx 这个必须放在个位置,否则要先定义i, 如: arr = [i for i in range(5), j for j in range(5), []] 这是错误的 这是正确的 c、del 语句和 : 的用法 可以用 start : end 表示数组里的一个区间 ( i >= start and i < end) del 删除数组里的指定元素 如: d、遍历数组: e、增加元素: 一维 arr.append('') 二维 arr[0].append('') 此外还有一种特殊的用法是: 在不指定下标的情况下,是允许用 += 增加数组元素的。 (2) Tuple 固定数组Tuple 是不可变 list,一旦创建了一个 tuple 就不能以任何方式改变它。 下面拿具体示例说明: [1] 不能向 tuple 增加元素,没有 append 、 extend 、insert 等方法。 [2] 不能从 tuple 删除元素,没有 remove 或 pop 方法。 [3] 不能在 tuple 中查找元素,没有 index 方法(index是查找而不是索引,索引直接用下标即可,如:t[0])。 使用 tuple 的好处: Tuple 可以转换成 list, 反之亦然。 转换方式为: 反之: (2) Dictionary (哈希数组)词典数组 Dictionary 的用法比较简单,它可以存储任意值,并允许是不同类型的值,下面实例来说明: 下面例子中 a 是整数, b 是字符串, c 是数组,这个r=range(11,101)例子充分说明哈希数组的适用性。 输出所有的key 输出所有的value 遍历数组python数组的使用
2 快速入门2.1 Hello world
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。