草庐IT

第四讲 Python中的常见语句

1314068 2023-03-28 原文

4.1  if条件判断语句

4.1.1  if条件判断语句单分支

◆单分支格式:if 判断条件:

语句块1……

else:

语句块2……

Ø例:name=input('请输入您的用户名:')

if name == 'admin':

               print('欢迎管理员用户')

           else:

               print('欢迎普通用户')#输出:请输入您的用户名:

Ø例:num=10

if num>5:

    print('请选择物品进行兑换')

else:

    print('积分不足')#输出:请选择物品进行兑换

4.1.2  if条件判断语句多分支

◆多分支格式:if 判断条件1:

语句块1……

elif 判断条件2:

语句块2……

elif 判断条件3:

语句块3……

else:

语句块n

Ø例:name=input('请输入您的用户名:')

if name == 'admin':

                      print('欢迎管理员用户')

               elif name == 'kitty':

                     print('欢迎kitty用户')

               else:

                     print('用户不存在,请注册')

4.1.3  if条件判断语句的三目运算

◆三目运算基本格式:

name = input('请输入您的用户名:')

print ('在上海' if name == 'xiaowang' else '在深圳')

只适用于if条件判断语句的单分支

Ø例:name = input('请输入您的用户名:')

print('香港') if name == '深圳' else print('广东')#输出请输入您的用户名:

Ø例:dict={'name':'老六','age':18}

if dict.__contains__('class') is True:

    print(dict)

else:

    dict['class']=1844

    print(dict)#输出{'name': '老六', 'age': 18, 'class': 1844}

换位三目运算:

→dict={'name':'老六','age':18}

print(dict) if dict.__contains__('class') is True else dict.setdefault('class',1844) and print(dict)

#输出{'name': '老六', 'age': 18, 'class': 1844}

→dict={'name':'老六','age':18,'class':1999}

print(dict) if dict.__contains__('class') is True else dict.setdefault('class',1844) and print(dict)

#输出{'name': '老六', 'age': 18, 'class': 1999}

Ø例:登录功能实战练习

→通过输入函数/输入用户名/先判断用户名是否正确,用户名正确则进行密码判断

   # 如果用户名错误则提示:"用户名错误,请重新输入"

密码错误则提示"密码错误,请重新输入密码"

输入正确密码则登录成功

法1:username = input('请输入你的用户名:')

if username == 'admin':

    password = input('123456')

    if password == '123456':

        print('登录成功')

    else:

        print('您输入的密码有误,请重新输入')

else:

    print('您输入的用户名有误,请重新输入')

法2:dict={'username':'admin','password':'123456'}

username=input('请输入你的用户名:')

if username==dict.get('username'):

    password=input('请输入你的密码:')

    if password==dict.get('password'):

        print('登录成功')

    else:

        print('您输入的密码有误,请重新输入')

else:

    print('您输入的密码有误,请重新输入')

4.1.4  if语句之if的嵌套语句(if中包含if)

if 判断条件1:

语句块1

if 判断条件2:

语句块2

else:

语句块3

else:

语句块4

4.2  while循环语句

◆while语句的格式:

while 条件表达式:

循环体语句

◆while什么时候进入循环?当循环条件成立时,进入循环

◆while什么时候退出循环?当循环条件不成立时,退出循环

◆注意:在写while循环语句时一定要让循环条件发生变化,否认很容易陷入死循环中

Ø例:使用循环语句求出1—100的和

i=1

j=0

while i<101:

      j=i+j

      i+=1

print(j)#输出5050

Ø例:使用循环语句求出1—100之内的奇数之和

i=1

j=0

while i<=100:

       j+=i

       i+=2

print(j)#输出2500

Ø例:使用循环语句求出1—100之内的奇数之和减去偶数之和的结果

★              i=0

odd=0

even=0

while i<=100:

    if i%2==0:

        even+=i

    else:

        odd+=i

    i+=1

print(odd-even)#输出-50

4.3  for循环语句

◆for循环的语法格式如下:

for ... in ...

语句块

◆遍历(Traversal):是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。访问结点所做的操作依赖于具体的应用问题, 具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是不一样的。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

◆for循环遍历

字符串、列表、字典、元组、集合均可遍历,但不可遍历整型。

1>遍历字符串

str='python'

for i in str:

     print(i,end='')#输出python

2>遍历列表

list=[1,2,3,4,'a','b']

for i in list:

     print(i,end='')#输出1234ab

3>遍历元组

tuple=(1,2,3,4,['a','b'])

for i in tuple:

     print(i,end='')#输出1234['a', 'b']

4>遍历字典

dict={'name':'张三','age':18}

for i,j in dict.items():

     print(i,j)#输出name 张三  age 18

5>遍历集合

test='python'

set=set(test)

for i in set:

     print(i,end='')#输出npotyh

6>遍历整型(整型不能遍历)

test=123

for i in test:

        print(i)#TypeError: 'int' object is not iterable

Ø例:使用for循环打印出字符串hellokitty每个字符以及字符的索引值,并且进行格式化输出

Østr='hello'

for i,j in enumerate(str):

     print(j,'对应的索引值是',i)

Østr='hello'

for i in str:

     print('%s对应的索引值是%d' % (i,str.index(i)))

#输出h对应的索引值是0

e对应的索引值是1

l对应的索引值是2

l对应的索引值是2

o对应的索引值是4

Østr = 'hello'

for i in str:

    s=str.index(i)

    print('字符:%s 对应的索引值是:%d' % (i, s))

#输出字符:h 对应的索引值是:0

字符:e 对应的索引值是:1

字符:l 对应的索引值是:2

字符:l 对应的索引值是:2

字符:o 对应的索引值是:4

◆先熟悉下range()函数:如果需要遍历一个数字序列,可以使用python中内建的函数range()

for i in range (10) #打印0到9、不包含10

for i in range (1,10) #打印1到9、不包含10

for i in range (0,10,2) #打印结果:0,2,4,6,8不包含10

Ø例:for i in range(10):

             print(i)#输出0123456789  纵向打印

 print(i,end='')#输出0123456789   end=''横向打印

Ø例:for i in range(9,0,-1):

         print(i)#输出987654321纵向打印

Ø例:使用for循环求1-100的和

sum=0

for i in range(1,101):

    sum+=i

print(sum)#输出5050

Ø例:使用for循环求1-100的奇数之和

sum=0

for i in range(1,101,2):

    sum+=i

print(sum)#输出2500

Ø例:使用for循环求1-100的偶数之和

sum=0

for i in range(1,101,2):

    sum+=i+1

print(sum)#输出2550

4.4  continue语句

◆用法:continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。


Ølist = [1,2,3,4,5,6,7,8,9]

for i in list:

    if i==6:

       continue

    print (i,end='')

#输出12345789

Øfor i in range(10):

     if i==5:

          continue

     print(i,end='')

#输出012346789

4.5  break语句

◆用法:语句会立即退出循环,在其后边的循环代码不会被执行。

Ølist = [1,2,3,4,5,6,7,8,9]

for i in list:

    if i==6:

       break

    print (i,end='')

#输出12345

Øfor i in range(10):

    if i==5:

       break

    print (i,end='')

#输出   01234

练习:求出1/1+1/3+1/5+...+1/99的和

Øi=1

sum=0

for i in range(1,100,2):

    sum+=1/i

print(sum) 

Øi=1

sum=0

while i<100:

    sum+=1/i

    i+=2

print(sum)

#输出2.937774848474907

练习:用循环语句计算2-10之间整数的循环相乘的值

Øi=2

sum=1

while i<11:

    sum*=i

    i=i+1

print(sum)

 

Øsum=1

for i in range(2,11):

    sum*=i

print(sum)#输出3628800

4.6 排序方法

Python基本排序方法:选择排序、插入排序、冒泡排序、快速排序、希尔排序、归并排序、堆排序、基数排序、计数排序、桶排序。

4.6.1 冒泡排序

◆冒泡排序(Bubble Sort):是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。【这个算法的来由是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序),如同气泡一样最终会浮到液体顶端,故名冒泡排序。】

◆算法思路:

从前到后(即下标较小的元素开始)依次比较相邻元素的值,若发现比后一个值大,则交换位置,使值较大的元素逐渐从前向后移动

★例:

import numpy as np#导入numpy整个模块,并指定别名为np

pop_list = np.random.randint(100,size=6)#从0到100随机取六位数【random()返回随机生成的一个实数。注意:random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。random.randint() 方法返回指定范围内的整数】

count=len(pop_list)#使用len函数获取列表长度

for i in range(count-1):#列表长度减一,控制循环次数

   for j in range(count-i-1):#控制索引取值范围

      if pop_list[j]>pop_list[j+1]:

        pop_list[j],pop_list[j+1]=pop_list[j+1], pop_list[j]

print('排序好之后的位置为:',pop_list)

#输出'排序好之后的位置为: [ 4  6  7 35 62 69]'

4.6.2  递归方法

递归方法(recursion  algorithm):在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。【递归就是一个函数在它的函数体内调用它自身】

4.6.2.1  递归的组成部分

◆终止条件:返回函数值,以防止进入一直调用函数的无限递归中,如果没有了递归条件,函数就变成了无限调用)

◆递归步骤:递归函数每步参数之间的关联         

第一步:找出终止条件:当时间是最后一天,即第十天结束

第二步:确定递归步骤:今天桃子的数量除以2再减去1,就是明天桃子的数量

第三步:将公式进行变形,再更换成具体天数

今天桃子的数量/2-1=明天桃子的数量,

今天桃子的数量=(明天桃子的数量+1)*2

第1天桃子数量=(第2天桃子数量+1)*2

        第2天桃子数量=(第3天桃子数量+1)*2 .......

第四步:创建一个函数并将函数参数设置为天数  

每次调用函数时进行天数的判断,如果天数达到终止条件,则直接设置桃子的数量为1

如果不是第十天即不是最后一天,需要根据递归步骤公式进行计算

Ø【例】猴子吃桃:第一天猴群吃掉了桃子所有的1/2又多一个,第二天猴群吃掉了剩余桃子的1/2又多一个,按照这样的吃法,直到第10天,猴群发现只剩下一个桃子,问猴子一共摘了多少只桃子?

#for循环语句求解              x=1

for i in range(1,10):

    x=(x+1)*2

print('猴子一共摘桃子总数为:',x)

#while语句求解

x=0

y=1

d=9

while d>0:

    x=(y+1)*2

    y=x

    d-=1

print(x)

#输出猴子一共摘桃子总数为: 1534

#递归方法求解

def peach(day):

    if day==10:

        num=1

    else:

        num=(peach(day+1)+1)*2

    return num

print(peach(1))#输出1534

Ø例:递归的阶乘>>求5!

def fn(num):

    if num==1:

        return 1#满足终止条件直接返回1

    else:

        return num*fn(num-1)

print(fn(5))#输出120

递归过程(为了明确递归过程,现对5!进行过程分解)  

def p(n):

                              if n==0:

                                    return

                              print('递归前->',n)

                              p(n-1)

                              print('递归后->',n)

                          p(5)

fn(5)                     #第1次调用使用5

5*fn(4)                   #第2次调用使用4

5*(4*fn(3))               #第3次调用使用3

5*(4*(3*fn(2)))           #第4次调用使用2

5*(4*(3*(2*fn(1))))       #第5次调用使用1

5*(4*(3*(2*1)))           #从第5次调用返回

5*(4*(3*2))               #从第4次调用返回

5*(4*6)                   #从第3次调用返回

5*24                      #从第2次调用返回

120                       #从第1次调用返回

★注意:当num = 998时能输出正确答案,但当num=999及更大数字时,就出现下面的错误了:

RecursionError: maximum recursion depth exceeded in comparison

这是由于默认的Python有一个可用的递归深度的限制,以避免耗尽计算机中的内存。默认是999。 

Ø例:1,1,2,3,5,8,13,21,34,55,试判断数列第十五个数是哪个?

def f(n):

    if n<=2:

        v=1

        return v

    else:

        v=f(n-1)+f(n-2)

        return v

print(f(15))#输出610

4.6.2.2  递归算法主要应用范围

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(比如Fibonacci函数)

(2)问题解法按递归算法实现。(回溯)[]

(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)  

4.6.2.3  递归的特点

1、必须有一个明确的结束条件

2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少

3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

【拓展】

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。

栈可以用来在函数调用的时候存储断点,做递归时要用到栈。

以上定义是在经典计算机科学中的解释。

计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录堆栈帧一般包含如下几方面的信息:

1.函数的返回地址和参数

2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

                          栈的模型

4.6.2.4  递归优缺点

Ø优点:递归使代码看起来更加整洁、优雅;可以用递归将复杂任务分解成更简单的子问题;使用递归比使用一些嵌套迭代更容易

Ø缺点:递归的逻辑很难调试、跟进;递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

★递归函数就是把每次的调用压入到栈里面,当你调用p(5)时,我们会把p(5)压到栈里面,因为前面有递归的流程,递归流程还没有结束.p(5)等待,接着调用p(4)、p(3)、p(2)、p(1),当调用到p(1)时,递归前面到递归前面的部分还是会被打印出来,紧接着就p(n-1),也就是1-1=0满足了终止条件,递归结束,栈的话是后进先出的,先会执行p(1)....最后执行p(6)

有关第四讲 Python中的常见语句的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐