Python Revisited Day 04 (控制结构与函数)
4.1 控制结构
4.1.1 条件分支
if ....:
suite1
elif ...:
suite2
...
elif ...:
suiteN
else:
suite_else
条件表达式
expression1 if boolean_expression else expression2
import random
999 if random.random() > 0.5 else 0 #999 or 0
999 + 1 if random.random() > 0.5 else 0 # 1000 or 0
999 + (1 if random.random() > 0.5 else 0) # 1000 or 999
4.1.2 循环
4.1.2.1 while循环
while boolean_expression:
while_suite
else: #有些时候还蛮有用的 循环正常执行结束后执行
else_suite
4.1.2.2 for循环
for expression in iterable:
for_suite
else: #循环正常结束后执行
else_suite
for i in range(5):
print(i)
else:
print('!!!!')
0
1
2
3
4
!!!!
for i in range(5):
if i == 3:
break
print(i)
else:
print('!!!!')
0
1
2
return 同样会跳过else_suite
4.2 异常处理
4.2.1 捕获与产生异常
try:
try_suite
except exception_group1 as variable1:
except_suite1
...
except exception_group1 as variable1:
except_suiteN
else: #try部分正常执行才会执行这部分
else_suite
finally: #总会执行 即便异常没有被捕获到 往往用于确保资源被正确释放
finally_suite
更加简单的try...finally...
try:
try_suite
finally:
finally_suite
产生异常 raise
raise exception(args)
raise exception(args) from original_exception
raise
raise KeyError('dasd') # KeyError: 'dasd'
4.2.2 自定义异常
class exceptionName(baseException): pass
注意:上面的baseException是指某个已存在的关于异常的类
class WAWAWAError(KeyError):
pass
tips 用异常跳出深层嵌套循环
flag = False
for i in range(9):
for j in range(9):
for k in range(9):
if i + j +k > 10:
flag = True
break
if flag:
break
if flag:
break
else:
print(flag)
当i + j + k > 10的时候,我们希望能跳出循环,虽然这个代码块的样子还挺帅的,但是很蠢吧。
class ExitException(Exception): pass
try:
for i in range(9):
for j in range(9):
for k in range(9):
if i + j +k > 10:
raise ExitException()
except ExitException:
print('Come on!')
else:
print('You will not see me!')
4.3 自定义函数
Tips 参数默认值为可变时 危险
给定默认值的时候,参数时在程序执行def时就建立的了,所以,当参数默认值为可变对象的时候,危险。
def append_if_even(x, lst=[]): #从对象绑定的角度考虑,合情合理
if x % 2 == 0:
lst.append(x)
print(lst)
append_if_even(2) #[2]
append_if_even(2) #[2, 2]
append_if_even(2) #[2, 2, 2]
append_if_even(2) #[2, 2, 2, 2]
字符串 数字 元组等都是固定变量
def append_if_even(x, lst=''):
if x % 2 == 0:
lst += '?'
print(lst)
append_if_even(2) # '?'
append_if_even(2) # '?'
append_if_even(2) # '?'
append_if_even(2) # '?'
def append_if_even(x, lst=None):
lst = [] if lst is None else lst
if x % 2 == 0:
lst += '?'
print(lst)
4.3.1 名称与Docstrings
def simpledoc(real, dream='sky'):
""" Returns the text I can not control now...
real is any string; dream is the same as well, while it has default value 'sky'.
Of course, your different people has various dreams, but we all need to confront
the real life.
>>> simpledoc('god')
"haha happy"
>>> simpledoc('god', 'earth')
"don't cry, go forward..."
"""
if real == 'god' and dream == 'sky':
return 'haha happy'
else:
return "don't cry, go forward..."
4.3.2 参数与参数拆分
def product(*args):
print(args)
result = 1
for arg in args:
result += arg
return result
product(2,3,4,5) # (2, 3, 4, 5) 15
*args 后面仍然可以使用关键词参数
def sum_of_powers(*args, power=1): #虽然power不添加默认值不会报错,但是使用的时候必须用关键词参数的形式传入值
result = 0
for arg in args:
result += arg ** power
return result
* 用于区分位置参数和关键词参数 def f(a, b, *, c = 0): ...
def sum_and_add(a, b, *, c = 0):
return a + b + c
sum_and_add(1, 2) # 3
sum_and_add(1, 2, 1) #TypeError
sum_and_add(1, 2, c = 1) # 4
f(**options)
**用于传入参数
options = dict(a = 1, b = 2, c = 1) #如果有多余的参数,会TypeError
sum_and_add(**options) # 4
**用于函数构建
def add(prime = 0, **adds):
for key, value in adds.items():
print(key)
prime += value
return prime
add(a = 1, b = 2, c = 3) # a b c 6
4.3.3 存取全局范围的变量 global
def remain():
global REMAIN
REMAIN = 3
def sum_and_add(a, b):
remain() #得执行一次
return a + b + REMAIN
sum_and_add(1, 2) # 6
4.3.4 Lambda 函数
lambda parameters: expression
expression 不能包含分支或循环,也不能包含return或yield。如果expression是一个元组,那么应该用括号包起来。
f = lambda : (1, 2)
f() # (1, 2)
f = lambda x: "" if x == 1 else 's'
f(1) # ''
4.3.5 断言 assert
assert boolean_expression, optional_expression
def product(*args):
assert all(args), "0 argument"
result = 1
for arg in args:
result *= arg
return result
product(*[1, 2, 3, 4]) # 24
练习
import os
import sys
WORD_FORWARD = "Choose filename: "
WORD_CONTINUE = "Press Enter to continue..."
WORD_OPTION1 = "[A/a]dd [D/d]elete [S/s]ave [Q/q]uit [a]: "
WORD_OPTION2 = "[A/a]dd [Q/q]uit [a]: "
WORD_ERROR_FILENAME = "Sorry, {0} is not found..."
WORD_ERROR_OPTION1 = "ERROR: invalid choice--enter one of 'AaDdSsQq'"
WORD_ERROR_OPTION2 = "ERROR: invalid choice--enter one of 'AaQq'"
WORD_FILES_ZERO = "-- no items are in list --"
WORD_ADD_ITEM = "Add item: "
WORD_DELETE_ITEM = "Delete item number (or 0 to cancel): "
WORD_ERROR_DELETE = "The number exceeds the limits..."
WORD_SAVE_ITEM = "Saved {0} item{1} to {2}"
WORD_SAVE_UNSAVED = "Save unsaved changes (y/n) [y]: "
def filename_and_set():
f = None
files = []
global filename
try:
filename = input(WORD_FORWARD)
if filename[-4:] != '.txt': #.txt 代替.lst
filename += '.txt'
f = open(filename)
for item in f:
files.append(item.rstrip())
except FileNotFoundError:
pass
finally:
if f is not None:
f.close()
return files
def delete_item(files):
flag = input(WORD_DELETE_ITEM)
try:
flag = int(flag)
if flag is 0:
pass
else:
files.pop(flag - 1)
except ValueError:
print("Integer is need...")
except IndexError:
print(WORD_ERROR_DELETE)
def save_item(files):
f = None
n = len(files)
try:
f = open(filename, 'w', encoding='utf8')
for item in files:
f.write(item + '\n')
print(WORD_SAVE_ITEM.format(n,
's' if n > 1 else '',
filename))
except:
print('ERROR: SAVE...')
finally:
if f is not None:
f.close()
def quit_item(files):
n = len(files)
flag = input(WORD_SAVE_UNSAVED)
if flag is 'y' or not flag:
save_item(files)
sys.exit()
def option1(files, label):
if label == 'A' or label == 'a' or not label:
files.append(input(WORD_ADD_ITEM))
elif label == 'D' or label == 'd':
delete_item(files)
elif label == 'S' or label =='s':
save_item(files)
elif label == 'Q' or label == 'q':
quit_item(files)
else:
print(WORD_ERROR_OPTION1)
def option2(files, label):
if label == 'A' or label == 'a' or not label:
files.append(input(WORD_ADD_ITEM))
elif label == 'Q' or label == 'q':
quit_item(files)
else:
print(WORD_ERROR_OPTION2)
def screen_show(files):
n = len(files)
if n != 0:
files.sort()
if not n:
print(WORD_FILES_ZERO)
label = input(WORD_OPTION2)
option2(files, label)
else:
for i in range(n):
print("{0}: {1}".format(i+1, files[i]))
label = input(WORD_OPTION1)
option1(files, label)
def main():
files = filename_and_set()
count = 1
while True:
count += 1
if count > 10:
break
screen_show(files)
print('\n\n')
main()
Python Revisited Day 04 (控制结构与函数)的更多相关文章
- Python快速学习04:循环 & 函数
前言 系列文章:[传送门] 也就今天认识了 LC ,很开心. 本文目录 循环 for while 中断 函数 函数定义 函数调用 for循环 Python 中的for 循环象shell 脚本里的for ...
- 翻译《Writing Idiomatic Python》(二):函数、异常
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- PYTHON 100days学习笔记006:函数和模块的使用
目录 Day006:函数和模块的使用 1.函数的作用 2.定义函数 2.1 语法 2.2 实例 2.3 函数的调用 4.函数的参数 4.1 必须参数 4.2 关键字参数 4.3 默认参数 4.4 不定 ...
- python应用 曲线拟合04
python应用 曲线拟合04 → 多项式拟合 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲 ...
- Python黑帽编程2.5 函数
Python黑帽编程2.5 函数 写了几节的基础知识,真心感觉有点力不从心.这块的内容说实话,看文档是最好的方式,本人的写作水平,真的是找不出更好的写法,头疼.简单带过和没写一样,写详细了和本系列教程 ...
- Python学习【第九篇】函数
函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...
- Python标准库:内置函数hasattr(object, name)
Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...
- Python内置的字符串处理函数整理
Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...
- Python函数式编程:内置函数map()使用说明
一.概述 map操作是函数式编程中的重要技术之一,其作用就是对一个集合中的每个元素做处理,生成一个新的元素,由这些新的元素组成一个新的集合的返回. 所以map操作后,产生的新集合的元素个数和原集合的元 ...
随机推荐
- Json.net日期格式化设置
Json.net默认的时间格式化后带T,不符合一般的业务要求,重新设置JSON.NET的默认日期格式化方式,代码如下: /// <summary> /// Json.net默认转换设置 / ...
- adb入门学习笔记
连接模拟器(模拟器桥接模式) 使用adb devices列出已连接到工作站的设备. 使用adb shell 启动设备或模拟器上的shell. 列出设备已安装的所有软件包 将电脑文件移动到手机模拟器上( ...
- ZooKeeper Observers解决节点过多时写性能下降问题
ZooKeeper Observers Observers: Scaling ZooKeeper Without Hurting Write Performance How to use Observ ...
- WPF设计の不规则窗体
我们在工作中,经常会需要画一些不规则的窗体,现在总结如下. 一.利用VisualBrush实现.这依赖于VisualBrush的特性,任何控件可以作为画刷,而画刷又可以作为背景. 此种方法可以用于实现 ...
- linux学习笔记整理(一)
第二章 Linux基本操作 2.1 Linux网络相关概念和修改IP地址的方法2.2 关闭防火墙并设置开机开不启动2.3 临时和永久关闭Selinux2.4 设置系统光盘开机自动挂载2.5 配置本地 ...
- python六十四课——高阶函数练习题(三)
案例五:求两个列表元素的和,返回新列表lt1 = [1,2,3,4]lt2 = [5,6]效果:[6,8,10,12] lt1=[1,2,3,4] lt2=[5,6] print(list(map(l ...
- JAVA序列化和反序列化XML
package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...
- idea在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误
在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误 在maven projects中图标toggle'skip Tests' Mode //宏杰帮助 网上案例:https://blo ...
- Jmeter插件安装及使用
1 安装Plugins Manager插件 1.1 下载Plugins Manager插件 插件下载官方地址:https://jmeter-plugins.org/downloads/all/ 将下载 ...
- [matlab] 7.快速搜索随机树(RRT---Rapidly-exploring Random Trees) 路径规划
RRT是一种多维空间中有效率的规划方法.它以一个初始点作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当随机树中的叶子节点包含了目标点或进入了目标区域,便可以在随机树中找到一条由从初始 ...