#pyhton简介及当中的while、for循环及format格式化输出的应用

2018/07/08 16:22
阅读数 10

#Python作为一门解释性语言 具有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(一般为CPython)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护的优点。 缺点: 运行速度较编译型相比,会 慢很多,因为它每次运行都会解释一遍。但是在现阶段计算机运行速度速度越来越快的情况下,一般情况下人类的感知即便是python的运行速度,也超过了人类的感知范围。

##编译与解释 编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。

解释具有良好的动态特性和可移植性,比如在解释执行时可以动态改变变量的类型、对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。同时解释器也有很大的缺点,比如执行效率低,占用空间大,因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。

编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.

##编译型语言

<span>    </span>和其他汇编语言一样,编译器(Compiler)会将我们写的代码转换成为机器可识别的可执行代码,这个过程就称之为编译(Compile)。 一般来说如果我们写的源代码都在一个程序里面,那么经过compile后就会直接生成一个可执行文件 ,直接运行就会得到我们要的结果,但是对于复杂的程序一般我们为了方便管理,会将项目的各个不同功能的部分分散到不同的模块组织,形成多个源文件,这是后再去编译就会形成目标文件(Object file)不像前面所说的单独一个源文件,这个复杂项目之间各程序是相互联系,相互配合调用的,每一个源文件都会编译对应到一个目标文件。这些目标文件基本上已经是可执行的代码,但是它们都只是整个项目的一部分,所以还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,而这个过程会由一个(Linker)链接程序来完成,它的工作就像是把各执行文件链接装配起来,除了链接各文件,它还会链接文件中引入的图片、声音、其他资源等。这一切工作完成后就能得到我们想要的可执行项目了

##解释型语言

<span>    </span>解释和编译所代表的意思都差不多,不过是在时间上有些许差别,<span style="color:red;"> 编译型 </span>就比如你和外国人通过google翻译交流,你们有两种方式,一是通过邮件,当你写好新邮件(此处代表编译型语言源文件)然后通过google翻译成老外可以识别的语言(此处指电脑可识别)然后整个邮件发送给他读,而<span style="color:red;">解释型</span>就好比你们两通过ins通过wechat通过facebook或者推特,然后当中的插件会立刻把你发送的消息转换成对方可识别的语言,让你们一句一句的交流。解释型语言就是这样。

两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行……所以,解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件、运行。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。

<hr/>

###两种语言的应用场景 编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。

###动态语言和静态语言 动态语言和静态语言 通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。 (1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。 (2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

##Python中的while循环和for循环 学过C语言的人来说这个非常简单,就做一些简单的介绍和书写,python本身是一门严格缩进的语言,所以写代码过程中一定要注意缩进,如我们做一个循环统计一个班级中n个人的成绩。每统计一个人的成绩都会输入姓名、成绩,将数据存储到一个字典中。

  • while循环来做
dic_score = {}
n = int(input("班级总人数:"))
i =1
while i < n+1:
    stu_name = input("姓名:")
    try:
        stu_score = int(input("分数:"))
        dic_score[stu_name] = stu_score
    except Exception as e :
        print("分数只能为数字或请勿重复输入学生姓名!")
        continue
    i = i + 1
  • for循环
dic_score = {}
n = int(input("班级总人数:"))
for i in range(n):
    stu_name = input("姓名:")
    try:
      stu_score = int(input("分数:"))
      dic_score[stu_name] = stu_score
    except Exception as e :
        print("分数只能为数字或请勿重复输入学生姓名!")
        continue

##format定制输出的魅力 在python中想要定制输出一般来说有三种常用方式

  • 字符串拼接<span style="color:red">print("这是一个简单的"+"python"+"程序")</span> 在这个输出语句中,我们把三个字符串拼接起来了!看起来很不错的样子,可是当你需要拼接的字符串多起来,就显得冗长,且计算机每个字符串都需要去开辟一个内存空间,这样也不太好

  • %s将个人信息定制化输出

name = "lina"
age =  22
job = "model"
information = """
---- info of %s ----
Name : %s
Age : %s
Job : %s"""%(name,name,age,job)

使用%s来定制输出似乎看起已经很方便了,而在python的确也是这样

  • format的魅力 在使用str.format()时,可用带位置参数,或者不带{},只要format中有对应的参数即可,也可以把列表使用format(*[])的形式传入参数,注意字典要用format(**dict)方式传
#直接传入
"he said his name is {} from {}".format("luna","China")
#字符串中加入参数位置
info = ['wangli', 20]
'{0} is my brother,he is {1} years old'.format('wangli', 20)
'{0} is my brother,he is {1} years old'.format(*info)

#关键字参数名定制
name = "lina"
age = 24
""" ---- info of {_Name} ----
Name : {_Name}
Age : {_Age}""".format(_Name = name, _Age = age) 

#填充和定制
#格式{'参数位‘:'填充位'>'填充数量'} 如{0:->10)   参数0的>箭头为右向左填充 - 号,数量为10个。[参数]:[填充字符][对齐方式 <^>][宽度]
# >为左填充,<为右填充,^为内容居中
>>> 'you should know {0:->10}'.format("format")  ##左填充,右对齐 10 - 6(format占个数)= 4(填充个数)
you should know ----format
>>> 'you should know {0:-<10}'.format("format")  ##右填充,左对齐
you should know format----
>>> 'you should know {0:-^10}'.format("format")  ##居中对齐
you should know --format--

#精度与定制
>>> '{0:.2f}'.format(1/3) #保留两位小数
'0.33'
>>> '{0:b}'.format(10)    #二进制
'1010'
>>> '{0:o}'.format(10)     #八进制
'12'
>>> '{0:d}'.format(10)     #十进制
'10'

#索引定制
>>> info
['lina', 23]
>>> 'she said call she {0[0]} ,and she was {0[1]}'.format(info)
she said call she lina, and she was 23

<span style="color: #2e6da4">记住如果要传列表前面加一个 * 号format(*list) 字典加两个 ** 号format(**dict)。 </span> 通过上面的列子,我们可以了解到format相比于%s来说,自由度很高,应用方式十分多,不像%s一样单一!方便,切能定制出漂亮简洁的字符串,而这不也是Python的核心吗.

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部