Python(一)—— 控制流:if & for & while
基操
编程语言类
编译型
程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。编译型语言可以理解为看一本英文书,看不懂翻译成中文就 OK ,以后看中文版本。
C、C++、C#
解释型
解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。解释型语言理解为看一本英文书,每次去看都要找一个翻译当场翻译,翻译一行看一行
Java、JavaScript、Python、Erlang、PHP、Perl、Ruby
总结:编译型语言速度快
选 python2 还是 python3
当然选大的!python 2 到 2020 年就不再更新咯,库也更新得差不多,python 3 面临更好的生态环境,所以用 python 3。这里推荐用 Anaconda ,里面内置了许多有用的库: https://www.anaconda.com/distribution/ ,根据系统位数下载就 ok ,记得配置环境变量,cmd 下输入 python 可以看到 python 版本就 ok
C:\Users\Admin>python Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.
利用 Pycharm 新建项目
- 打开 Pycharm == > new project
- locaton 内选择自己想要存放的 project 路径,以及项目名称
- 保存即可,会在路径下生成一个 package 文件,再往其中添加 python file 即可
需要注意的是:
- 不要作死写到虚拟环境里面去,找不到项目就自己坑自己
- 路径最好不要有中文,空格,除下划线之外的特殊字符
基础
注释
注释是用于 # 负号右边的文字,主要是给作者以及程序阅读者看的笔记,例如:
print ('Hello World') # 注意 print 是一个函数
在我们的程序设计当中应该更多地使用注释:
- 解释假设
- 说明重要的决定
- 解释更多细节
- 说明想要解决的问题
- 说明想要在程序中克服的困难等
代码可以告诉我们,这件事是如何解决的,注释当中其实也应该体现,因为阅读这串代码的人可能是几个月之后的你
字面常量
什么叫字面常量呢?就是 5 、1.23 这样的数字,或者是 'Life is short, you need Python' 字符串,或者是 '人生苦短,我用 python' 这样的文本
数字
数字分为两种类型:整型 + 浮点型
int 整型就是整数,例如:2
float 浮点数就是非整数:3.14,3.14E-3。这里,E 表示 10 的幂,比如 3.14E-3 就是 3.14*10^-3
字符串
string 类型,是字符的一串序列,基本上可以理解字符串就是一串词汇
格式化方法
有时候我们希望从其他信息中构建字符串,那么可以使用 format() 方法:
age = 18 name = 'gzw' print('{0} is {1} years old'.format(name,age))
输出:
gzw is 18 years old
它是如何工作的?
一个字符串可以使用某些特定的格式(Specification),随后, format 方法将被调用,使用这一方法中与之相应的参数替换这些格式。
在这里要注意我们第一次应用这一方法的地方,此处 {0} 对应的是变量 name ,它是该格式化方法中的第一个参数。与之类似,第二个格式 {1} 对应的是变量 age ,它是格式化方法中的第二个参数。请注意,Python 从 0 开始计数,这意味着索引中的第一位是 0,第二位是 1,以此类推。
除此之外,我们可以使用联立字符串的方式来达到该效果:
name + 'is' +str(age) + 'years old'
但是这种实现方式,显而易见不如上面的直观,而且也容易出错。其次,转换至字符串的工作将由 format 方法自动完成,而不是如这般需要明确转换至字符串。再次,当使用 format 方法时,我们可以直接改动文字而不必与变量打交道,反之亦然。
同时还应注意数字只是一个可选选项,所以你同样可以写成:
age = 18 name = 'gzw' print('{} is {} years old'.format(name,age))
这样做同样能得到与前面的程序一样的输出结果。
Python 中 format 方法所做的事情便是将每个参数值替换至格式所在的位置。这之中可以有更详细的格式,例如:
# 对于浮点数 '0.333' 保留小数点(.)后三位 print('{0:.3f}'.format(1.0/3)) # 使用下划线填充文本,并保持文字处于中间位置 # 使用 (^) 定义 '___hello___'字符串长度为 11 print('{0:_^11}'.format('hello')) # 基于关键词输出 'gzw is 18' print('{name} is {age}'.format(name='gzw', age= 18))
输出:
0.333 ___hello___ gzw is 18
由于我们正在讨论格式问题,就要注意 print 总是会以一个不可见的“新一行”字符( \n )结尾,因此重复调用 print 将会在相互独立的一行中分别打印。为防止打印过程中出现这一换行符,你可以通过 end 指定其应以空白结尾:
print('a', end='')
print('b', end='')
输出结果如下:
ab
或者通过 end 指定以空格结尾:
print('a', end=' ') print('b', end=' ') print('c')
输出结果如下:
a b c
转义字符
想象一下,如果你希望生成一串包含单引号( ' )的字符串,你应该如何指定这串字符串?例如,你想要的字符串是 "What's your name?" 。你不能指定 'What's your name?' ,因为这会使 Python 对于何处是字符串的开始、何处又是结束而感到困惑。所以,你必须指定这个单引号不代表这串字符串的结尾。这可以通过 转义序列(Escape Sequence) 来实现。你通过 \ 来指定单引号:要注意它可是反斜杠。现在,你可以将字符串指定为 'What\'s your name?' 。
另一种指定这一特别的字符串的方式是这样的: "What's your name?" ,如这个例子般使用双引号。类似地, 你必须在使用双引号括起的字符串中对字符串内的双引号使用转义序列。同样,你必须使用转义序列 \\ 来指定反斜杠本身。
如果想指定一串双行字符串该怎么办?一种方式即使用如前所述的三引号字符串,或者可以使用一个表示新一行的转义序列—— \n 来表示新一行的开始。下面是一个例子:
'This is the first line\nThis is the second line'
另一个你应该知道的大有用处的转义序列是制表符: \t 。实际上还有很多的转义序列,但我必须只在此展示最重要的一些。
还有一件需要的事情,在一个字符串中,一个放置在末尾的反斜杠表示字符串将在下一行继续,但不会添加新的一行。来看看例子:
"This is the first sentence. \ This is the second sentence."
相当于
"This is the first sentence. This is the second sentence."
原始字符串
如果需要指定一些未经过特殊处理的字符串,比如转义序列,那么你需要在字符串前增加 r 或 R 来指定一个 原始(Raw) 字符串:
r"Newlines are indicated by \n"
变量命名规则
变量是标识符的一个例子。标识符(Identifiers) 是为 某些东西 提供的给定名称。在命名标识符时,需要遵守以下规则:
- 第一个字符必须是字母表中的字母(大写 ASCII 字符或小写 ASCII 字符或 Unicode 字符)或下划线( _ )。
- 标识符的其它部分可以由字符(大写 ASCII 字符或小写 ASCII 字符或 Unicode 字符)、下划线( _ )、数字(0~9)组成。
- 标识符名称区分大小写。例如, myname 和 myName 并不等同。要注意到前者是小写字母 n 而后者是大写字母 N 。
- 有效 的标识符名称可以是 i 或 name_2_3 ,无效 的标识符名称可能是
变量一般用小驼峰命名,类函数等一般使用大驼峰命名法。
小驼峰:myStudentCount 第一个单词全部是小写,后面的单词首字母大写
大驼峰:DataBaseUser 第一个字母就大写
控制流
在 Python 中有三种控制流语句—— if for 和 while
if
用以检查条件:如果条件为真(True),我们将运行一块语句(称作 if-block 或 if 块),否则我们将运行另一块语句(称作 else-block 或 else 块)。其中 else 从句是可选的。而且要注意的是,if 判断语句后面,一定一定要跟 : 否则不会判断为一个 if 判断条件,会报语法错误
if 语句用以检查条件:如果条件为真(True),我们将运行一块语句(称作 if-block 或 if 块),否则我们将运行另一块语句(称作 else-block 或 else 块)。其中 else 从句是可选的。
age = int(input('Please input your age: ')) if age<18 : print('你是小鲜肉') else: print('你是老腊肉')
比如上述语句,当输入的 age 大于等于 18,就会输出:你是老腊肉;小于18,就会输出:你是小鲜肉
再比如:
num = float(input("请输入一个数字: ")) if num > 0: print("输入值为正数")#如果输入的数大于0则输出:输入值为正数 elif num == 0: print("输入为0")#如果输入的数等于0则输出:输入为0 else: print("输入值为负数")#上述条件都不符合则输出:输入值为负数
内嵌 if
num = float(input("请输入一个数字: ")) if num >= 0:#先进行判断输入的数字是否>=0,如果是则进行第二个if判断,如果不是则直接跳过到else if num == 0: print("零") else: print("正数") else: print("负数")
多条判断
score = input('请输入你的成绩:') score = int(score) if score>=90: print('优秀') elif score>=75 and score<90 : print('良好') elif score>=60 and score<75: print('及格') else: print('不及格')
for 循环
for i in range (1,5): print(i)
结果:
1 2 3 4
- range返回一个从第一个数字到第二个数字的一个数字序列。例如,range(1,5)给出序列[1, 2, 3, 4]。
- 默认情况下,range 步距取为1。如果我们提供第三个数字,range那么它变成了步距。例如range(1,5,2)得到[1,3]。
- range()生成一个数字序列,当for循环请求下一个项目时,它一次只生成一个数字。如果你想立刻看到完整的数字序列,使用list(range())。
同样要记住, else 部分是可选的。当循环中包含他时,它总会在 for 循环结束后开始执行,除非程序遇到了 break 语句。
另一个需要注意的地方是 for...in 能在任何队列中工作。
while
while 语句能够让你在条件为真的前提下重复执行某块语句。 while 语句是 循环(Looping) 语句的一种。 while 语句同样可以拥有 else 子句作为可选选项。
import random num = random.randint(1,100) # 90 1 count = 0 #计数器 while count<7: guess = input('请输入你要猜的数字:') guess = int(guess) if guess>num: print('猜大了') elif guess<num: print('猜小了') else: print('恭喜猜对了,数字是:',num) break count+=1 #循环体,循环的时候是在重复执行循环体里面东西 # break 在循环里面遇到break,立即结束循环,不管循环有没有循环完 # continue 在循环里面遇到continue 那么就结束本次循环,继续进行下一次循环
while 是怎么工作的呢?
number = 23 running = True while running: guess = int(input('Enter an integer : ')) if guess == number: print('Congratulations, you guessed it.') # 这将导致 while 循环中止 running = False elif guess < number: print('No, it is a little higher than that.') else: print('No, it is a little lower than that.') else: print('The while loop is over.') # 在这里你可以做你想做的任何事 print('Done')
在这一程序中,我们依旧通过猜数游戏来演示,不过新程序的优点在于能够允许用户持续猜测直至他猜中为止——而无需像我们在上一节中所做的那样,每次猜测都要重新运行程序。
这种变化恰到好处地演示了 while 语句的作用。
首先我们将 input 与 if 语句移到 while 循环之中,并在 while 循环开始前将变量running 设置为 True 。程序开始时,我们首先检查变量 running 是否为 True ,之后再执行相应的 while 块。在这一代码块被执行之后,将会重新对条件进行检查,在本例中也就是 running 变量。如果它依旧为 True ,我们将再次执行 while 块,否则我们将继续执行可选的 else 块,然后进入到下一个语句中。
else 代码块在 while 循环的条件变为 False 时开始执行——这个开始的时机甚至可能是在第一次检查条件的时候。如果 while 循环中存在一个 else 代码块,它将总是被执行,除非你通过 break 语句来中断这一循环。
理解 elif 和 else
正常来讲,我们写 if 语句,下面可以跟哪些? elif 和 else。elif 是什么呢?上面的 num 例子内,就是个 :if - else if - else 块合并成 if - elif -else 块,只是让程序更简便而已,并且减少相应的缩进量,相当于 if 下面的又一个 if 判断
那么 else 是啥意思呢?意思是当 if 后面的判断条件为 False ,则执行 else 内容。相应的 while 和 for 都有对应的 else ,那么何时执行 else 呢?当 while 或者 for 循环块内为 False 了,就执行 else ,比如说不符合 for 循环了,或者 break 了,都算没执行完 for 循环
三元表达式
当 x>y ,则打印 aaaaa,否则打印 bbbbb,三元表达式只能有一层 else ,不能有 elseif 等
res='aaaaa' if x > y else 'bbbbbbb'
理解 break 和 continue
break 和 continue 是用来跳出当前层循环的。注意是当前层。也就是说假设循环是嵌套,就只能跳出 break 和 continue 所在的那一层
区别在于:一执行到 break 是后面的循环都不执行;一执行到 continue 是只跳出当前层循环,后面的循环依旧照常执行。
continue = 把老师打晕,今天不上课;break = 把老师打死,以后都不用上课。