Python 学习之旅,DAY 2—python 基础(2)

​Python 学习之旅,DAY 2—python 基础(2)

学习内容

  • pyc?解释型 or编译型?
  • 选择结构if…else
  • 循环结构—for循环
  • 循环结构—while循环
  • break and continue
  • 贴出一道oldbly培训班的作业题(致敬alex)

一.PYC?解释型 or 编译型

a.python真的是一门解释型语言吗?

作为一名python初学者,你会在各种各样的经典书籍或者视频教程上看到,python是一门解释型语言,如果你只关心程序能否运行,你一直这么相信下去了。然后有一天, 你在搜索文件的时候,无意间发现一个文件它的后缀名是*.pyc。你会感觉你的世界观在崩塌,pyc是个什么鬼?c应该是compiled的缩写啊,可python不是解释型语言吗?一群技术大牛吃饱了没事干商量着祸害祖国未来的花儿?
不要担心,为了防止其他学习python的小朋友也被这句话误解,我们就来详细讨论一下这个问题。

b.哪有什么纯粹的非黑即白

我上一篇推文写了解释型和编译型语言的区别,也知道了编译和解释各有各的缺点。我们知道编译型语言因为运行之前就有“编译”的过程,所以运行效率会比较高。但我们同时也要明白一点,时代在向前,语言当然也要进步,缺点不能永远是你的缺点吧。《 孔雀东南飞》告诉我们“不能在一棵树上吊死”,所以一些解释型语言会通过对解释器的优化来在对程序做出翻译时对整个程序做出优化,这样一来,有时候解释型语言在效率上甚至超过了编译型语言,实现“脚踏两只船”的骚操作。

用java来举例,java首先通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件,所以说java是一种先编译后解释的语言。
所以,现在我们不能把语言纯粹地分成解释型和编译型了,哪有什么纯粹的非黑即白?

c.Python究竟是啥?

其实Python和Java一样,都是基于虚拟机的语言。当我们在命令行中输入python ahaha.py的时候,其实就是激活了Python的解释器,解释器执行的第一项工作和Java一样,是编译,然后再进行解释成机器文件。

二.选择结构if…else

因为看我推文的多多少少有点计算机基础,if…else我就不打算详细介绍了。python的if…else结构除了强制的缩进结构外,与c语言的没有太大区别。下面用一段代码说明:

_username="geekboy"
_password="abc123"
username=input("username:")
password=input("password:")
if _username==username and _password==password:
    print("Welcome user {name} login...".format(name=username))
else:
    print("Invalid username or password")

程序是先定义了用户名和密码,在通过与用户输入的用户名和密码作对比检测登入。若是用户输入与内存中的数据匹配,则执行if下的语句,否则就执行else下的语句。值得注意的是,程序中的and是python中逻辑“与”的意思,这点是与c语言有所区别的。另外,该程序还出现一种比较常见的字符串拼接的方法----现在{}中定义一个变量,再在format中给这个变量赋值。

上面介绍的是双分支的选择结构,下面我们来看看多分支的选择结构:

_username="geekboy"
_password="abc123"
username=input("username:")
password=input("password:")
if _username==username and _password==password:
    print("Welcome user {name} login...".format(name=username))
elif _username==username and_password!=password:
    print("Your password is wrong.Please try again.")
else:
    print("Invalid username or password")

python的多分支结构是 if…elif…else,其中可以视情况多增加几个elif。不知道大家有没有注意到,python通过强制缩进来表明所属关系,这让代码更加优美和明晰。作为一名成熟的计算机学习者,不管我们使用什么语言,都应该善用缩进结构来增加自己代码的优美度和可读性。

三.循环结构—for循环

先用一段代码作引入,让我们看看python中for函数的基本用法:

for i in range(10):
    print("loop:",i)

让我们来看看程序的输出:

loop:0
loop:1
loop:2
loop:3
loop:4
loop:5
loop:6
loop:7
loop:8
loop:9

我们可以看出,for函数的基本用法为for i in range(n),其中n为函数的循环次数。在上述程序中,i从0开始,循环十次,一直循环到9,每循环一次就将i拼接到"loop:"字符串中。

上面介绍了一下for函数的基本操作,我们思考一下,也是上面的程序,但这次我们不想要loop后跟着单数了,也就是我们只取双数,我们应该怎么做呢。你固然可以多定义一个变量count初始化为0,然后让程序循环5次,在每次循环中让count自增2,但这样做同时也不符合了python语言简单优美的哲学。接下来我们看看下面这段代码是怎么做的。

for i in range(0,10,2):
    print("loop:",i)

原来,for函数除了前面所说的用法外,还有新的玩法。完整的for函数可获取三个参数,第一个参数是循环的初始值,意味着循环将从这个值开始;第二个参数就是循环的结束值(但不包括这个值),意味着循环将在得到这个值之前结束;第三个参数就是循环间距,意思就是一次循环到下一次循环i自增的数值。

下面我们看看这段程序运行的效果:

loop:0
loop:2
loop:4
loop:6
loop:8

你看,是不是达到了我们想要的效果呢?

神奇的for…else结构

看看下面一段代码:

age_of_me=19
for i in range(3):
    guess_age=eval(input("guess age:"))    
    if guess_age==age_of_me:
        print("yes,you got it.")
        break
    elif guess_age>age_of_me:
        print("think smaller...")
    else:
        print("think bigger...")
else:
    print("you have try too many time...fuck off")

这段代码的主要功能是让用户去猜测年龄。猜三次未果后,显示猜测过多的词条,然后结束程序。看到这个else你会不会感到有点懵,else不应该出现在if语句后的吗?这里出现的else是什么意思呢?其实结果是很显而易见的,循环三次以后,i再继续增加将不再满足循环条件,退出循环后,就开始执行else语句。言外之意就是,假如用户3次以内猜中了年龄,跳出循环语句后,将不会执行else语句。ps:for…else语句是python独有的,学习其他语言的同学们不要随便迁移。

四.循环结构----while循环

刚刚介绍了一下for函数,我们知道for可以很简单进行成千上万次的循环。但是遇上一些循环条件复杂的循环,我们怎么写呢?比如当 a==b and d==c时循环才结束,for循环就没法表示了,这个时候while循环结构就要闪亮登场了。while的使用并不复杂,原则上所有的for函数都可以用while来改写(至于为什么不全用while,是因为for运行速度比较快),下面我们用while改写一下上面的“猜数游戏”吧:

# Author:Geekboy
age_of_me=19
count=0
while count<3:
    guess_age=eval(input("guess age:"))
    if guess_age==age_of_me:
        print("yes,you got it.")
        break
    elif guess_age>age_of_me:
        print("think smaller...")
    else:
        print("think bigger...")
    count+=1
else:
    print("you have try too many time...fuck off")#只有python有这样的语法

程序比较简单,这里就不详述了。下面说说要注意的几个点:while循环中,循环数是不会自增的,所以在循环体内,要自行设置循环数自增count+=1,如果忘记设置,结果将是count一直满足循环条件,一直循环一直爽,直至你的计算机跟世界说goodbye。第二个点我们关注一下输入时的eval函数,好好的输入为什么要加这个函数呢?有兴趣的同学可以删掉试试!我们要清楚一点,input函数使所有的用户输入格式都为字符串格式。字符串是不能直接用来比较的,eval函数的作用就是删掉变量中带着的外围引号,这样数字"n"就变成n,才可以用来直接比较。

while loop

有一种循环叫死循环,一经触发,就运行个天荒地老,海枯石烂------alex

海枯石烂代码:

count=0
while True:
    print("我爱你",count)
    count+=1#不行,我太肉麻了

死循环代码还是少写为妙,毕竟除了时间,没有什么是永恒的。像"我爱你"这种代码,循环个百八十遍得了,没必要Love you 3000。计算机内存是有限的 ,年轻人写代码一定要有节制。我能说的就那么多了。

我们学习了while循环,学习了if选择结构,下面我们来试验一下我们的学习成果。同样是猜数游戏,我们猜三次以后,程序要问用户是否继续,假如用户回答是"y",则猜数继续,否则进程结束。这时代码该怎么写呢?我们来思考一下:

# Author:Geekboy
age_of_me=19
count=0
while count<3:
    guess_age=eval(input("guess age:"))
    if guess_age==age_of_me:        
        print("yes,you got it.")
        break
    elif guess_age>age_of_me:
        print("think smaller...")
    else:
        print("think bigger...")
    count+=1
    if count==3:
        continue_confirm=input("dou you want to keep guessing...?")
        if continue_confirm =='y':
            count=0
 else:
    print("you have try too many time...fuck off")

通过while和if结合的方法,我们可以轻松地实现这个程序。但是值得大家注意的是一个以后你写程序会比较常见的一个思想-----置零。猜三次询问用户一次,很多初学者实现这个程序的方法是让count正常自增,然后去判断count是否3的倍数,这方法可以吗?的确可以,但是如果场景不是猜年龄呢,随着循环次数的增加,count也在增加,一旦循环次数过多,count有可能就会溢出。所以面对这种问题,最好的解决方法是让count每三次置零一次,程序从零开始,继续判断。置零的操作在循环判断中非常常见,值得大家注意。

五.break and continue

前面的程序中很多都用到了break语句,大家对break语句都有一个模糊的认识。下面我们就通过程序来仔仔细细的认识一下break,并且看看它与continue的区别。
我们先来看看一段continue语句的用法:

for i in range(10):
    if i<5:
        continue
    print("loop:",i)

先来看看程序的输出:

loop:5
loop:6
loop:7
loop:8
loop:9

我们很容易看到,程序跳过了i<5的循环,从i=5开始输出,直至循环结束。这时候contine的作用也就呼之欲出了,在满足if条件时,continue会跳过此次的循环且又不跳出整个大循环,去执行程序的下一个循环。

我们尝试把上述程序的continue改成break,去看看break的效用:

进程已结束,退出代码0

下面就是改成break以后的运行效果,也就是说没有输出,为什么呢?我们来分析一下:

通过与continue的对比学习,假如break的作用是跳出整个大循环,那运行结果就解释得通了。为了验证这种说法,我们可以在代码后面加一行 print(i)看看i为几时跳出的循环。结果不出意外i的值将等于0,也就是说当第一次判断循环条件时,因为i=0符合条件,执行语句break,跳出整个for循环,程序结束。

所以在实际编写程序的时候,我们一定要注意continue和break的区别,逻辑方面的程序错误解释器是不会报错的,在写程序时一定要三思而后行,才能最终得到我们想要的结果。

六.贴出一道oldbly培训班的作业题(致敬alex)

我总是在推文中想方设法地致敬一下oldbly这个培训机构,oldboy是国内python教育的领头羊。我觉得他的作业题出得也比较有意思,所以贴出来给大家看看,后期有时间会专门写一篇讲解。

作业1:编写登陆接口


  • 输入用户名密码
  • 认证成功后显示欢迎信息
  • 输错三次后锁定

作业2:多级菜单


  • 三级菜单
  • 可依次选择进入各子菜单
  • 所需新知识点:列表,字典

作业涉及了一点文件操作,且有一定的难度,做不出来不要灰心,只要坚持学习,就肯定会有进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值