2.控制语句
有些时候我们需要控制代码进行的顺序,或者重复多段代码,此时我们就需要控制语句。
2.1 条件语句(分支语句)
if else语句来表达:如果…否则…
语法格式:
#(1) if expression: do_something1 do_something2 next_something #(2) if expression: do_something1 else: do_something2 # (3) if expression1: do_something1 elif expression2: d o_something2 else: do_something3
注意:Python中的条件语句写法, 和很多编程语言不太一样.
- if 后面的条件表达式, 没有 ( ), 使用 : 作为结尾.
- if / else 命中条件后要执行的 “语句块”, 使用 缩进 (通常是 4 个空格或者 1 个 tab)来表示, 而不是 { }
- 对于多条件分支, 不是写作 else if, 而是 elif (合体了).
示例:不同的缩进有着不同的结果:
判断一个年是否是闰年:
#输入一个年份判断是闰年还是平年 #input是按字符串格式接受,要转化成整型 year = int(input('请输入一个年份:')) if ((year%4==0) and (year%100 != 0)) or (year%400==0): print(f'{year}是闰年') else: print(f'{year}不是闰年')
2.1.1 空语句
为了表达该语句什么也不做,Python引入了空语句
pass
使用示例:
a=1 if a==1: #pass代表空语句什么也不做 pass print('haha')
2.2 循环语句
2.2.1 while
while 条件: 循环体
满足条件执行循环体,否则跳出循环。
计算5的阶乘:
#计算5的阶乘 n=1 i=1 while i<=5: n*=i i+=1 print(n)
计算1!+2!+3!+4!+5!之和
#计算1!+2!+3!+4!+5!之和 sum = 0 #把各个阶乘加起来 i=1 while i<=5: #每次初始化n ,j n=1 j=1 #求每个阶乘 while j<=i: n=n*j j+=1 i+=1 sum+=n print(sum)
2.2.2 for循环
基本语法格式:
for 循环变量 in 可迭代对象: 循环体
- python 的 for 和其他语言不同, 没有 “初始化语句”, “循环条件判定语句”, “循环变量更新语句”, 而是更加简单
- 所谓的 “可迭代对象”, 指的是 “内部包含多个元素, 能一个一个把元素取出来的特殊变量”
打印1~10
for i in range(1,11): print(i)
使用 range 函数, 能够生成一个可迭代对象. 生成的范围是 [1, 11), 也就是 [1, 10]
打印2,4,6,8,10
for i in range(2,11,2): print(i)
通过 range 的第三个参数, 可以指定迭代时候的 “步长”. 也就是一次让循环变量加几.
打印10~1
for i in range(10,0,-1): print(i)
range 的 步长 也可以设定成负数.
2.2.3 contibue
continue 直接跳过本次循环,进行下一次循环
示例:
for i in range (1,4): if i==2: continue print(i)
该代码跳过i==2,打印1,3
2.2.4 break
break直接跳出本层循环,相当于中断循环的意思
示例:
for i in range(1, 4): if i == 2: break print(i)
该代码只打印了1,可知在i==2时,直接中断了循环
3. 函数
函数是一段可以被重复使用的代码片段 .
使用函数可以简化代码量,使文章逻辑更清晰。
代码示例: 求数列的和, 不使用函数
# 1. 求 1 - 100 的和 sum = 0 for i in range(1, 101): sum += i print(sum) # 2. 求 300 - 400 的和 sum = 0 for i in range(300, 401): sum += i print(sum) # 3. 求 1 - 1000 的和 sum = 0 for i in range(1, 1001): sum += i print(sum)
这组代码有很多重复的语句,仅仅是变量不同,我们可以把重复的代码提取出来,构成函数。
代码示例: 求数列的和, 使用函数
#求和函数 def add(beg,end): sum = 0 for i in range(beg,end + 1): sum += i print(sum) add(1,100) add(300,400) add(1,1000)
可以看到代码量减少许多,重复的代码已经消除
3.1 语法格式
创建函数:
def 函数名(形参列表): 函数体 return 返回值
调用函数/使用函数:
#函数名(实参列表) // 不考虑返回值 #返回值 = 函数名(实参列表) // 考虑返回值
key:函数必须先定义再使用,否则会报错
test3() # 还没有执行到定义, 就先执行调用了, 此时就会报错. def test3(): print('hello')
报错内容如下:
3.2 函数参数
在函数定义的时候, 可以在 ( ) 中指定 “形式参数” (简称 形参), 然后在调用的时候, 由调用者把 “实际参数” (简称 实参) 传递进去
代码示例:
#求和函数 def add(beg,end): sum = 0 for i in range(beg,end + 1): sum += i print(sum) add(1,100) add(300,400) add(1,1000)
上面的代码中, beg, end 就是函数的形参. 1, 100 / 300, 400 就是函数的实参.
注意:
- 和 C++ / Java 不同, Python 是动态类型的编程语言, 函数的形参不必指定参数类型. 换句话说, 一个函数可以支持多种不同类型的参数
例如下面代码:
#一个函数参数可以接受多种类型的实参 def test(a): print(a) test(10) test('hello') test(True)
3.3 函数返回值
函数的参数可以视为是函数的 “输入”, 则函数的返回值, 就可以视为是函数的 “输出”
如下代码:
# 定义求和函数 def add(a, b): return a + b ret = add(5, 6) print(ret)
上述代码就使用了函数的返回值
支持一次返回多个值,这是Python所特有的!!!
# 定义求和函数 def add_sub(a, b): return a + b, a - b sum, sub = add_sub(5, 6) print(sum,sub)
运行结果:
使用 _ 来忽略不想要的返回值.
# 定义求和函数 def add_sub(a, b): return a + b, a - b #使用_来进行占位,表示不接收第一个返回值 _, sub = add_sub(5, 6) print(sub)
使用_来占位,只接受一个返回值
3.4 变量作用域
在Python中:
在函数内部的变量, 也称为 “局部变量”
不在任何函数内部的变量, 也称为 “全局变量”
变量只能在所在的函数内部中生效,出了函数变量就销毁了!
如下示例:
def getPoint(): x = 10 y = 20 return x, y getPoint() print(x, y)
这段代码,编译器提醒我们x,y未定义
在不同的作用域中,允许存在同名变量
x = 20 def test(): x = 10 print(f'函数内部 x = {x}') test() print(f'函数外部 x = {x}')
只要在不同的作用域中,变量可以同名
如果是想在函数内部, 修改全局变量的值, 需要使用 global 关键字声明:
x=10 def fun(): #告诉函数,这个x是全局变量 global x x = 20 fun() print(x)
通过global声明,函数也能修改全局变量的值啦
注意:
if ,for ,while 语句的语句块不会影响到变量的作用域
换言之,for语句定义的变量i,在for语句外,也能使用。
示例:
for i in range(1,4): print(f'函数内部 i = {i}') print(f'函数外部 i = {i}')
3.5 函数递归
递归是嵌套调用中的一种特殊情况, 即一个函数嵌套调用自己.
递归示例:
def factor(n): if n == 1: return 1 return n * factor(n - 1) result = factor(5) print(result)
注意:
- 存在递归结束条件. 比如 if n == 1 就是结束条件. 当 n 为 1 的时候, 递归就结束了.
- 每次递归的时候,要保证函数的实参是逐渐逼近结束条件的
上述代码是经典的递归函数
3.6 参数默认值
Python 中的函数, 可以给形参指定默认值.
带有默认值的参数, 可以在调用的时候不传参.
代码示例:
def add(x, y, debug=False): if debug: print(f'调试信息: x={x}, y={y}') return x + y print(add(10, 20)) print(add(10, 20, True))
此处 debug=False 即为参数默认值. 当我们不指定第三个参数的时候, 默认 debug 的取值即为 False.
带有默认值的参数需要放到没有默认值的参数的后面:
def add(x, debug=False, y): if debug: print(f'调试信息: x={x}, y={y}') return x + y print(add(10, 20))
多个带有默认参数的形参,都得放在后面
3.7 关键字参数
在调用函数的时候, 需要给函数指定实参. 一般默认情况下是按照形参的顺序, 来依次传递实参的.
但是我们也可以通过关键字参数, 来调整这里的传参顺序, 显式指定当前实参传递给哪个形参。
代码示例:
def fun(x, y): print(f'x={x}') print(f'y={y}') fun(10,20) fun(y=10,x=20)
关键字参数也是Python特有的功能,这样可以方便的告诉程序员,这个函数要赋给谁。位置参数和关键字参数还能混着用,只不过混着用的时候,要求位置参数在前,关键字参数在后。