传统Python语言的主要控制结构是for循环。但是请注意,for循环在Pandas中并不常用,因此在Python中高效执行for循环不适用于Pandas模式。一些常见的控制结构如下。for循环while循环if/else语句try/except语句生成器表达式列表理解模式匹配所有程序最终都需要一种方法来控制执行流程。本节介绍一些用于控制执行流程的技术。01for循环for循环是Python中最基本的控制结构之一。使用for循环的一种常见模式是使用range函数生成一个值范围,然后对其进行迭代。res=range(3)print(list(res))#output:[0,1,2]foriinrange(3):print(i)'''output:012'''forlooplistusinganotherforloop常见的模式是遍历列表。martial_arts=["Sambo","MuayThai","BJJ"]formartial_artinmartial_arts:print(f"{martial_art}hasinfluenced\modernmixedmartialarts")'''输出:SambohasinfluencedmodernmixedmartialartsMuayThaihasinfluencedmodernmixedmartialartsBJJhasinfluencedmodernmixedmartialarts'''02while循环while循环是一种条件有效就会重复执行的循环。while循环的一个常见用途是创建无限循环。在此示例中,while循环用于过滤返回两种攻击类型之一的函数。defattacks():list_of_attacks=["lower_body","lower_body","upper_body"]print("Thereareatotalof{lenlist_of_attacks)}\attackscoming!")forattackinlist_of_attacks:yieldattackattack=attacks()count=0whilenext(attack)=="lower_body":count+=1print(f"crossinglegstopreventattack#{count}")else:count+=1print(f"Thisisnotlowerbodyattack,\Iwillcrossmyarmsfor#count}")'''输出:共有3次攻击即将到来!crossinglegstopreventattack#1crossinglegstopreventattack#2Thisisnotlowerbodyattack,\Iwillcrossmyarmsfor#count}'''03if/else语句if/else语句是一种常见的分支判断语句。本例中使用if/elif来匹配分支。如果没有匹配,则执行最后一个else语句。defrecommended_attack(position):"""根据位置推荐攻击"""ifposition="full_guard":print(f"Tryanarmbarattack")elifposition="half_guard":print(f"Tryakimuraattack")elifposition="fu1l_mount":print(f"Tryanarmtriangle")else:print(f"You'reonyourown,\thereisnosuggestionforanattack")recommended_attack("full_guard")#Output:Tryanarmbarattackrecommended_attack("z_guard")#Output:You'reonyourown,thereisnosuggestionforanattack04生成器表达式构建器表达式构建概念上,yield语句允许对序列进行延迟评估。生成器表达式的好处是在实际的评估计算之前不会评估或放入内存。这就是为什么可以在生成的无限随机攻击序列中执行以下示例的原因。在生成器管道中,将“arm_triangle”等小写攻击转换为“ARM_TRIANGLE”,然后去掉下划线得到“ARMTRIANGLE”。deflazy_return_random_attacks():"""Yieldattackseachtime"""importrandomattacks={"kimura":"upper_body","straight_ankle_lock":"lower_body","arm_triangle":"upper_body","keylock":"upper_body","knee_bar":"lower_body"}whileTrue:random_attackrandom.choices(list(attacks.keys()))yieldrandomattack#MakeallattacksappearasUpperCaseupper_case_attacks=\(attack.pop().upper()forattackin\lazy_return_random_attacks())next(upper-case_attacks)#输出:ARM-TRIANGLE##GeneratorPipeline:Oneexpressionchainsintothenext#MakeallattacksappearasUpperCaseupper-case_attacks=\(attack.pop().upper()forattackin\lazy_return_random_attacks())#removetheunderscoreremoveunderscore=\(attack.split("_")forattackin\upper-case_attacks)#createanew_phrasenew_attack这三个字=\("".join(phrase)forphrasein\remove_underscore)next(new_attack_phrase)#输出:'STRAIGHTANKLELOCK'fornumberinrange(10):print(next(new_attack_phrase))'''Output:KIMURAKEYLOCKSTRAIGHTANKLELOCK'''05Listcomprehensions从句法上讲,listcomprehensions类似于generatorexpression,但是直接对比,你会发现listcomprehensions是Evaluatesin内存此外,列表理解是优化的C代码,这可以被认为是对传统for循环的重大改进。martial_arts=["Sambo","MuayThai","BJJ"]new_phrases[f"mixedMartialArtsisinfluencedby\(martial_art)"formartial_artinmartial_arts]print(new_phrases)['MixedMartialArtsisinfluencedbySambo',\'MixedMartialArtsisinfluencedbyMuayThai',\'MixedMartialArtsisinfluencedbyMuayThai',\'MixedMartialBJIinsinfluencedby6BJArtsin'有了这些基础知识,不仅要了解如何创建代码,还要了解如何创建可维护的代码,这一点很重要。创建可维护代码的一种方法是创建一个库,另一种方法是使用您安装的第三方库编写的代码。总体思路是最小化和分解复杂性。用Python编写一个库用Python编写一个库很重要,然后将该库导入您的项目并不需要很长时间。以下这些示例是编写库的基础知识:在存储库中,有一个名为funclib的文件夹,其中包含一个_init_.py文件。要创建库,该目录中需要有一个包含函数的模块。首先创建一个文件。touchfunclib/funcmod.py并在该文件中创建一个函数。"""Thisisasasimplemodule"""deflist_of_belts_in_bjj():"""ReturnssalistofthebeltsinBrazilianjiu-jitsu"""belts=["white","blue","purple","brown","black"]returnbeltsimportsys;sys.path.append(..")fromfunclibimportfuncmodfuncmod.list_of_belts_in-bjj()#Output:['white','blue','purple','brown','black']importlibrary如果库是上面的目录,可以使用Jupyter添加sys.path.append方法导入库。接下来,使用之前创建的文件夹/文件名/函数名的命名空间导入模块。安装第三方库您可以使用pipinstall命令安装第三方库。请注意,conda命令(https://conda.io/docs/user-guide/tasks/manage-pkgs.html)是pip命令的可选替代品。如果你使用conda命令,那么pip命令也会很好用,因为pip是virtualenv虚拟环境的替代品,但是它也可以直接安装包。安装熊猫包。pipinstallpandas或者,可以使用requirements.txt文件安装包。>carerequirements.txtpylintpytestpytest-covclickjupyternbval>pipinstall-rrequirements.txt下面是在JupyterNotebook中使用小库的例子。值得指出的是,在JupyterNotebooks中创建巨大的程序代码蜘蛛网非常容易,一个非常简单的解决方案是创建一些库,然后测试并导入这些库。"""Thisisasimplemodule"""importpandasaspddeflist_of_belts_in_bjj():"""ReturnssalistofthebeltsinBrazilianjiu-jitsu"""belts=["white","blue","purple","brown","black"]returnbeltsdefcount_belts():"""UsesPandastocountnumberofbelts"""belts=list_of_belts_in_bjj()df=pd.Dataframe(belts)res=df.count()count=res.values.tolist()[0]returncountfromfunclib.funcmodimportcount_beltsprint(count_belts())#输出:5种可以重用JupyterNotebook中的类并与之交互。类最简单的类型就是名字,类的定义如下。classCompetitor:pass这个类可以被实例化成多个对象。classCompetitor:passconor=Competitor()conor.name="ConorMcGregor"conor.age=29conor.weight=155nate=Competitor()nate.name="NateDiaz"nate.age=30nate.weight=170defprint_competitor_age(object):"""printoutagestatisticsaboutacompetitor"""print(f"{object.name}is{object.age}yearsold")print_competitor_age(nate)#Output:NateDiazis30yearsoldprint_competitor_age(conor)#Output:ConorMcGregoris29yearsold类和函数的区别类和函数的主要区别包括:函数更容易解释。函数(通常)仅在函数内部具有状态,而类在函数外部保持不变的状态。类可以以复杂性为代价提供更高级别的抽象。
