Python基础刻意训练——DAY2
1.主要内容:条件与循环语句
前言:
python的基本语法结构的形式,和C(++)相差无几,只是对于某些写法,相对更加简洁一点。比如,python的基本语法结构忽略了给条件打上括号,(这样写代码相对更快一点)。再如,python的基本语法结构忽略了{ }的存在——因为python的一部分灵魂在于缩进,即它靠着缩进来实现语法结构的划分(也说明了在python中对于缩进的重视是必不可少的)。
条件语句的基础语法形式:
- 基本结构:
if 条件:
执行语句A
else:
执行语句B
注意:
1. 冒号必不可少
2.注意缩进,形成一定的结构
3.else 语句可以写(else语句中有要执行的B),也可以不写(else语句中没有要执行的代码)
举个栗子:
import random
a=random.randint(1,10)
if a > 5:
print('运气好,a是'+str(a))
else:
print('运气不好,a是'+str(a))
- 较复杂的判断语句:
对于条件很多的语句,我们需要将语句的条件进行划分,但基本结构只有简单的两种情况,这个时候就需要相应的一些结构以及一些逻辑运算辅助。
嵌套循环结构:
例如:
对于一个分段函数,存在几个划分的区间(分别是a<0,a>=0&&a<5,a>=5&&a<10,a>=10),各区间的函数表达式都不一样,这时候要求函数值,首先要对自变量所在的区间进行判断
则:
a=int(input('请输入:'))
if a>=10:
f=a
else:
if a<0:
f=a**2
else:
if a>=5:
f=a**3
else:
f=a**4
print(f)
可以发现,条件判断语句可以形成嵌套结构。由于python自身存在的缩进形式,导致整个代码形成斜向下的样子,这样的代码格式并不利于代码的表达——如果,条件很多,将会拉很长的左右间隔
于是,我们对这个代码进行了如下的改进:
a=int(input('请输入:'))
if a>=10:
f=a
elif a<0:
f=a**2
elif a>=0 and a<5:
f=a**4
elif a>=5 and a<10:
f=a**3
print(f)
在这里,利用了逻辑运算符关键字(and,还有其他的关键字 or与not),同时采用了常见的嵌套方式:elif(类似于C语言中的else if)。这样一来,条件可以均匀的排布下去,而不会使得代码变得很“奇怪”。
对于条件语句,在真正使用的时候,还可以结合一些操作,使得判断语句发挥其他的功能——比如break,continue等等
另外,在条件判断中,有一种三元操作符可以简化判断的过程,直接进行表达(类似于C语言中的三元操作,val=b>c?b:c——基本的取两个数的最大最小值)
在python中,这句代码可以这样表达:
val = b if b>c else c ##满足条件则取if前面的数字,不满足则取else后面的数字
最后,再给一个示例来练习条件判断语句:
题目:输入年(year)月(month),判断该月份的天数n
代码如下:
year,month=map(int,input('请输入年份与月份(隔空输入):').split())
if month%2!=0:
if month<=7:
print('该月份天数为31天')
else:
print('该月份天数为30天')
else:
if month>=8:
print('该月份天数为31天')
elif month!=2:
print('该月份天数为30天')
elif (year%4==0 and year%100!=0) or year%400==0:
print('该月份天数为29天,为闰月')
else:
print('该月份天数为28天')
循环语句的基础语法形式:
循环结构有两种基本形式的循环:for循环与while循环
- 基本结构
for 目标 in 表达式:
执行语句A ##for循环
while 判断条件:
执行语句B ##while语句
注意:
- for语句和while语句每执行一次语句后,都要回去判断条件是否成立(对于for语句,判断的是目标还在不在表达式中)
- 可能出现死循环的情况,这个时候,可以采用外部键入“Ctrl+C”的方式中断循环
举个栗子:
import random
for each in range(1,100):
print(random.random()) ###通过循环语句进行随机数的模拟
再举个栗子:
list1=[]
a=1
while a<=10:
list1.append(a)
a+=1 ##创建一个数组
for each in list1:
if each%2==0:
list1[each-1]*=2 ##对于数组中的偶数进行扩倍数
print(list1[each-1]) ##输出
- 较为复杂的循环结构
在实际应用中,往往根据需要对基本的结构进行一些变化和处理,比如,进行多次嵌套(for语句二重嵌套进行二维数组的操作),再比如,利用break加上判断语句,帮助跳出循环,从而使得语句能够去除掉不必要的一些运算。
给一个综合了条件判断与循环的例子:
###开锁,猜密码
number=1
name='Typhoid'
passwd=999999
while number<=3:
name_in=input('用户名为:')
passwd_in=int(input('密码为:'))
if name_in==name and passwd_in==passwd:
print('挑战成功')
break
else:
print('不对哦,再来一次')
print('您还剩余%d次机会!!'.format(3-number))
number +=1
else:
print('挑战失败')
2.今日学到的BIF
- assert(断言)——设定在容易出错的位置,判断其是否成立
assert (1>2) #会自动报错,抛出AssertionError
assert (1==1) ##正常执行程序
借助其操作,貌似可以实现一种较为简易的捕捉异常的方式。
- input(输入语句)
注:python2.x版本与python3.x有所区别。
python2输入数据,会根据其输入的情况,归为相应的一些数据类型;但是在python3中,为了程序更加稳定的运行,统一的将输入的标准数据类型,直接默认为str类型数据。因此,在本文中的输入操作赋值中,加上了int()强制转换的操作,保证得到的数据是整型数据。
参考链接:https://blog.csdn.net/qq_29883591/article/details/78177279
a=input('请输入:')
type(a) ##得到的是str类型的数据
a=int(input('请输入:'))
type(a) ##得到的是int类型的数据
- map()——基本映射
map函数为映射,也可称为哈希。该函数非常实用,而且其应用较为灵活,今天就先简单的提一提今天使用map的原理。
注意:python2与python3有着区别—>
python的map函数得到的是序列,而python3得到的迭代器,需要将该迭代器进行实例化,得到一个序列或者是其他的数据结构。
map(迭代函数,可迭代序列)——对于迭代函数可以有着灵活的自定义。
对于代码map(int,input(‘请输入:’.split()))——int作为一个强制转换的函数,后面的为一个字符串序列,最后得到的是新的生成的序列
参考链接:https://www.jb51.net/article/128315.htm
def square(x):
return x*x
k=map(square,[1,5,6,9,7])
type(k) #显示的是迭代器
list(k) #得到具体的数列
- split()函数
str.split(s,num) 有两个参数——s表示分割符号(不写则默认为空格;分割符不能打出来),num表示分割次数
最后得到的是字符串组成的序列
例如:
s='shj shjd hj'
s.split() ##得到序列['shj','shjd','hj']
s='abajak'
s.split('a') ##得到['', 'b', 'j', 'k']
参考链接:https://blog.csdn.net/NeverLate_gogogo/article/details/85294665
- range([start,]stop[,step=1])函数
——注意:留头不留尾;默认步长为1
参见链接:https://www.runoob.com/python/python-func-range.html与https://blog.csdn.net/weixin_43392489/article/details/99679338
list(range(0,10)) #结果为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
type(range(10)) #结果为class ‘range’ ——反映了range生成的是范围
type(list(range(10))) #这个才是list实例化后生成的数组
x='shishid'
for i in range(len(x)): #配合for循环语句,划定该范围
print(x[i])