技术标签: python python学习笔记 软件测试
本篇为下面这本书的读书笔记,对应练习可见Gitee地址:
python仓库 欢迎补充指正
python3.5一共68个内建函数,简单来讲是安装完就可以使用,是“自带的”。
如print(),input(),len(),int()等
几个常见的词:
def(define,定义):定义一个函数
arg(argument,参数):有时还有parameter,二者都是参数的意思,稍有不同
return:返回结果
def和return是关键字(keyword)
# 定义一个函数
def fahrenheit_converter(C):
fahrenheit = C * 9 / 5 + 32
return str(fahrenheit) + '˚F'
C2F = fahrenheit_converter(35)
print(C2F) # 95.0˚F
# 对函数作出修改
def fahrenheit_converter(C):
fahrenheit = C * 9 / 5 + 32
print(str(fahrenheit) + '˚F')
print(fahrenheit_converter(35))
print是一个函数并非关键字
对于在一开始就设定了必要参数的函数来说,打出函数名并向括号中传递参数实现对函数的调用(call),只要把参数放进函数的括号中即可
def fahrenheit_converter(C):
fahrenheit = C * 9 / 5 + 32
return str(fahrenheit) + '˚F'
fahrenheit_converter(35)
fahrenheit_converter(15)
fahrenheit_converter(0)
fahrenheit_converter(-3)
实际上传递参数有两种方式:位置参数和关键词参数
def trapezoid_area(base_up, base_down, height):
return 1 / 2 * (base_up + base_down) * height
print(trapezoid_area(1, 2, 3)) # 4.5(位置参数)
print(trapezoid_area(base_up=1, base_down=2, height=3)) # 4.5(关键词参数)
# trapezoid_area(height=3, base_down=2, base_up=1) # 关键词参数反序输入并不影响函数正常运作
# trapezoid_area(height=3, base_down=2, 1) # 错误语法,最后一个位置应该是参数height的位置,但与前面height已经按名称传入的3冲突
# trapezoid_area(base_up=1, base_down=2, 3) # 参数正序传入,前两个关键词的方式,最后一个以位置参数传入,可正常运行
# trapezoid_area(1, 2, height=3) # 参数正序传入,前两个以位置方式传入,最后一个以关键字参数传入,可正常运行
# 给一组变量赋值然后调用
使用命令行/终端只为更快展示结果,在IDE返回布尔值仍需使用print函数来实现
1>2 # False
1<2<3 # True
42 != '42' # True
'Name' == 'name' # False
'M' in 'Magic' # True
number = 12 # 没有输出
number is 12 # python3不能这样写
比较式成立返回True,不成立返回False
除此之外,还有多条件的比较。先给变量赋值再比较
注: abs()表示取绝对值函数
不同类型的对象不能使用“<,>,<=,>=”进行比较,但可用‘==’和‘!=’
浮点数和整数虽是不同类型,但不影响到比较运算
True = 1, False = 0
1 <> 3 其实等价于 1 != 3
in & is
# the_Eddie = 'Eddie'
# name = 'Eddie'
# the_Eddie == name
# the_Eddie is name
两个变量一致时经过is对比返回True,在python中任何对象都可判断其布尔值,除了0、None和所有空序列与集合(列表、字典、集合)布尔值为False之外其他都为
True。可使用函数bool()进行判别
# 给函数增加一个重置密码的功能
password_list = ['*#*#', '12345'] # 创建一个列表,存储用户的密码 、初始密码和其他数据(对实际用户数据库的简单模拟)
def account_login(): # 定义函数
password = input('Password:') # 获得字符串并存在变量中
password_correct = password == password_list[-1] # 当用户输入的密码等于密码列表中最后一个元素时(即用户最新设定的密码)登录成功
password_reset = password == password_list[0]
if password_correct:
print('Login success!')
elif password_reset:
new_password = input("Enter a new password:") # 当用户输入的密码等于密码列表中第一个元素时(重置密码的“口令”)触发密码变更,并
# 将变更后的密码存储至列表的最后一个,成为最新的用户密码
password_list.append(new_password)
print('Your password has changed successfully!')
account_login()
else:
print('Wrong password or invalid input!') # 一切不等于预设密码的输入结果,会执行打印错误提示,并且再次调用函数,让用户再次输入
account_login()
account_login()
for every_letter in 'Hello world':
print(every_letter)
songslist = ['Holy Diver', 'Thunderstruck', 'Rebel Rebel']
for song in songslist:
if song == 'Holy Diver':
print(song, ' - Dio')
elif song == 'Thunderstruck':
print(song, ' - AC/DC')
elif song == 'Rebel Rebel':
print(song, ' - David Bowie') # songslist列表中的每一个元素依次取出,分别与三个条件比较,若成立输出相应的内容
for i in range(1, 10):
for j in range(1, 10):
print('{} X {} = {}'.format(i, j, i * j))
存储大量数据的容器在python称之为内置数据结构(Built-in Data Structure)
python 有4种数据结构:列表、字典、元组、集合
# list = [val1, val2, val3, val4]
# dict = {key1:val1, key2:val2}
# tuple = (val1, val2, val3, val4)
# set = {val1, val2, val3, val4}
显著特征:
显著特征:
可理解成稳固版的列表,因元组不可修改,因此在列表中存在的方法均不可用在元组上,但元组可以被查看索引,方式同列表
letters = ('a', 'b', 'c', 'd', 'e', 'f', 'g')
letters[0]
每个集合中的元素是无序的、不重复的任意对象。可通过集合判断数据的从属关系,还可通过集合把数据结构中重复的元素减掉。
集合不能被切片也不能被索引,除了做集合运算外,集合元素可被添加和删除
a_set = {
1, 2, 3, 4}
a_set.add(5)
a_set.discard(5)
num_list = [6, 2, 7, 4, 1, 3, 5]
print(sorted(num_list)) # sort函数按照长短、大小、英文字母的顺序给每个列表中的元素进行排序;它并不会改变列表本身,可理解为先将列表复制然后再进行顺序的整理
# [1, 2, 3, 4, 5, 6, 7]
print(num_list.reverse) # 函数reverse()不返回列表而返回一个迭代器,可使用list将其转换为列表
print(list(reversed(num_list))) # [5, 3, 1, 4, 7, 2, 6]
str = [12, 13, 56, 43, 58]
# 如果同时需要两个列表,用zip()函数
for a, b in zip(num_list, str):
print(b, 'is', a)
# 普通写法
a = []
for i in range(1, 11):
print(a.append(i))
# 列表解析式
b = [i for i in range(1, 11)]
print(b)
列表解析式方便,且执行效率高,对比两者所耗费的时间
import time
a = []
t0 = time.process_time()
for i in range(1, 200000):
a.append(i)
print(time.process_time() - t0, "seconds process time")
t0 = time.process_time()
b = [i for i in range(1, 200000)]
print(time.process_time() - t0, "seconds process time")
列表推导式
# 列表推导式
a = [i ** 2 for i in range(1, 10)]
c = [j + 1 for j in range(1, 10)]
k = [n for n in range(1, 10) if n % 2 == 0]
z = [letter.lower() for letter in 'ABCDEFGHIGKLMN']
d = {
i:i+1 for i in range(4)}
g = {
i:j for i, j in zip(range(1, 6), 'abcde')}
g = {
i:j.upper() for i, j in zip(range(1,6), 'abcde')}
print(a, c, k, z, d, g)
列表是有序的,可使用python中独有的函数enumerate来进行
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for num, letter in enumerate(letters):
print(letter, 'is', num + 1)
类是有一些系列有共同特征和行为事物的抽象概念的总和
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
使用class定义一个类,缩进的地方formula变量装载着列表,在类里赋值的变量就是类的变量——类的属性(Class Attribute)。字符串、列表、字典、整数等都可以是变量,都可成为类的属性。
# coke_for_me = CocaCola()
# coke_for_you = CocaCola()
# print(CocaCola.formula)
# print(coke_for_me.formula)
# print(coke_for_you.formula)
# ['caffeine', 'sugar', 'water', 'soda']
# ['caffeine', 'sugar', 'water', 'soda']
# ['caffeine', 'sugar', 'water', 'soda']
左边创建变量,右边写上类的名称 – 实例化,被实例化之后的对象 – 实例(instance)
在类名后输入. ,可引用之前在定义类时的属性;类的属性会被所有类的实例共享,所以在类的实例后再点上. ,索引用的属性值是完全一样的。
类的属性与正常的变量并无区别。
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
coke_for_China = CocaCola()
coke_for_China.local_logo = '可口可乐' # 创建实例属性
print(coke_for_China.local_logo) #打印实例属性引用结果
object.attr
的形式进行一个赋值,得到一个新的实例的变量 – 实例变量 – 实例属性(Instance Attribute)实例方法
方法(Method) – 供实例使用 – 也称实例方法(Instance Method),使用类的方法来表示某种“功能”
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
def drink(self):
print('Energy!')
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
def drink(coke): #HERE!
print('Energy!')
coke = CocaCola()
coke.drink() # Energy!
# coke = CocaCola
# coke.drink() == CocaCola.drink(coke) # 左右两边写法完全一致
被实例化的对象会被编译器默默传入后面方法的括号中,作为第一个参数。实际中更多使用前面那种形式。self这个参数名称是可以更改的(编译器不会因此报错),但
按照python规矩统一使用self
类的方法也能有属于自己的参数,做些改动:
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
def drink(self, how_much):
if how_much == 'a sip':
print('Cool!!!)
elif how_much == 'whole bottle':
print('Headache!')
ice_coke = CocaCola()
ice_coke.drink('a sip') # Cool!!!
"魔术方法" <-- init()是其中一个
如果在类里定义,在创建实例时就会自动的处理很多事情,如新增实例属性。
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
def __init__(self):
self.local_logo = '可口可乐'
def drink(self): #HERE!
print('Energy!')
coke = CocaCola()
print(coke.local_logo) # 可口可乐
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
def __init__(self):
for element in self.formula:
print('Coke has {}!'.format(element))
def drink(self):
print('Energy!')
coke = CocaCola
除了必写的self参数外,init()可以有自己的参数,在实例化时往括号里放参数,相应的所有参数都会传递到__init__()方法中,和函数的参数的用法完全相同。
class CocaCola:
formula = ['caffeine', 'sugar', 'water', 'soda']
def __init__(self, logo_name):
self.local_logo = logo_name
def drink(self):
print('Energy!')
coke = CocaCola('可口可乐')
print(coke.local_logo) # 可口可乐
self.local_logo = logo_name
简单解释:左边是变量作为类的属性,右边是传入的参数 – 作为变量,即这个变量的赋值所存储的结果将取决于初始化时所传
进来的参数 logo_name
class CocaCola:
calories = 140
sodium = 45
total_carb = 39
caffeine = 34
ingredients = [
'High Fructose Corn Syrup',
'Carbonated Water',
'Phosphoric Acid',
'Natural Flavors',
'Caramel Color',
'Caffeine'
]
def __init__(self, logo_name):
self.local_logo = logo_name
def drink(self):
print('You got {} cal energy!'.format(self.calories))
# 类的继承(Inheritance),拿无卡可乐(caffeine-free)作为例子
class CaffeineFree(CocaCola): # 括号中放入CocaCola表示这个类是继承于CocaCola这个父类的。CaffeineFree成为了CocaCola的子类。
caffeine = 0
ingredients = [
'High Fructose Corn Syrup',
'Carbonated Water',
'Phosphoric Acid',
'Natural Flavors',
'Caramel Color',
]
coke_a = CaffeineFree('Cocacola-FREE')
coke_a.drink()
类中的变量和方法可以完全被子类继承,如需有特殊改动也可进行覆盖(Override)
Q1 类属性如果被重新赋值,是否会影响到类属性的引用?
class TestA:
attr = 1
obj_a = TestA()
TestA.attr = 42
print(obj_a.attr) # 42
Q2 实例属性如果被重新赋值,是否会影响到类属性的引用?
class TestA:
attr = 1
obj_a = TestA()
obj_b = TestA()
obj_a.attr = 42
print(obj_b.attr) # 1
Q3 类属性实例属性具有相同的名称,那么
.
之后引用的将会是什么?
class TestA:
attr = 1
def __init__(self):
self.attr = 42
obj_a = TestA()
obj_b = TestA()
print(obj_b.attr) # 42
__dict__
中。__dict__
是一个类的特殊属性,它是一个字典,用于存储类或实例的属性。即使不去定义,它也会存储在print(TestA.__dict__)
print(obj_a.__dict__)
>>> {‘attr’: 42}
其中,类TestA和类的实例obj_a各自拥有各自的attr属性,完全独立
python中属性的引用机制是自外而内的,创建了一个实例后,编译器会先搜索该实例是否有该属性 --> 如果没有,搜索这个实例所属的类是否有该属性 --> 如果
还没有,报错
obj1 = 1
obj2 = 'String!'
obj3 = []
obj4 = {
}
print(type(obj1), type(obj2), type(obj3), type(4)) # <class 'int'> <class 'str'> <class 'list'> <class 'int'>
python中任何种类的对象都是类的实例,上面的这些类型被称为内建类型,并不需要实例化。
制作一个填充用户假数据的小工具
父类:FakeUser
功能:
子类:SnsUser
功能:
搭建网站 – Django、轻量的Flask等Web框架;
写小游戏 – PyGame;
爬虫 – Scrapy框架;
数据统计分析 – Pandas数据框架…
根据自己需求按分类找到相应的库
https://awesome-python.com/ 比如想找爬虫方面的,就选择Web Crawling这个分类,即可看到相应的第三方库的网站与简介
直接使用搜索引擎
# 在终端/命令行中输入
pip -version # 查看pip版本
pip install PackageName # 安装PackageName
pip inatall --upgrade pip # 升级pip
pip uninstall flask # 卸载库
pip list # 查看已安装库
在pycharm中输入库的名字,会提示自动补全
import pandas
导入pandas库,灰色的代表还没有在程序中使用。要检查是否安装可使用pip的方式确认
…
File->setting->File Types在后面加上:.settings;.project;.classpath;*.class;classes;pom.properties;target;.DS_Store;*.iml;.idea;.svn;点击Apply,ok即可!
char *(*c[10])(int **p);1、c[10]是一个数组。2、*c[10]是一个指针数组。3、(*c[10])(int **p)是一个函数指针的数组,函数有一个int **p形参。4、char *(*c[10])(int **p);c是一个数组,该数组用于存放一个函数指针,该函数,有一个int**的形参,返回char*类型。char *(*c[10])(int
2012-01-16 10:35:58| 分类:VC++ | 标签:|字号大中小 订阅你在vs2008中默认字符集是UNICODE字符集,CString中字符以wchar_t的形式来存储的,而不是char。你在项目-》属性-》配置属性 有一个字符集,可以改字符集,改成多字节字符集就行了。 我在VC的unicode项目中使用如下代码时,提示错误“error
输入**openstack domain create --description "An Example Domain" example**命令后出现错误:Failed to discover available identity versions when contacting http://controller:5000/v3. Attempting to parse version from URL.
本次博文主要想记录一下自己在做运动模糊图像复原时的一些总结和心得感悟,方便以后回顾。Reference:Deblurring Text Images via L0 -Regularized Intensity and Gradient Prior 主要难点: 估计模糊模型解决方式: ①使用金字塔模型,创建模糊图像相应的层级图像;并根据缩放比例创建模糊模型...
更新了一下脚手架之后,在创建新项目了之后npm run serve 报了这个错误直接上方法。1.在最开始vue create xxx 的时候在勾选预选时把css那个也勾选上但是这个方法不大好,有时候就是不想勾怎么办。2.把webpack更新一下,还有其他能更新都更新把这样子应该就可以了。。。。。。...
在项目中使用了Spring管理和配置事务,在启动tomcat时报错:nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/BCException1java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutDesignatorHandler...
string中c_str()、data()、copy(p,n)函数的用法标准库的string类提供了3个成员函数来从一个string得到c类型的字符数组:c_str()、data()、copy(p,n)。1. c_str():生成一个const char*指针,指向以空字符终止的数组。注:①这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。因此
Tomcat 需要配置环境变量吗?tomcat 是一款轻量级web应用服务器,安装的时候我们都是直接解压zip包,然后在bin目录下双击 startup.bat 就可以启动了,但也相应的会遇到一些问题;1. Tomcat启动会出现的两个问题:JAVA_HOME 配置问题导致的闪退解决方案:配置jdk时以名字为JAVA_HOME的环境变量如果你在不是JAVA_HOME 而是 其他的...
# SpringBoot## 1、SpringBoot简介#### 1.1 回顾SpringSpring是一个开源框架,2003年兴起的一个轻量级的Java开发框架。**Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。**#### 1.2 Spring是如何简化开发的为了降低Java开发的复杂性,Spring采用了以下4种关键策略1、基于POJO的轻量级和最小侵入性编程,所有东西都是Bean2、通过IOC(控制反转),DI(依赖注入)面向接口实现松耦合3、基于切面编程(AO
漏扫设备发现OpenSSH有漏洞,需要升级到OpenSSH 8.1及以上版本,那么干脆就直接升级到发文时最新的版本,OpenSSH 8.3。做法是找到OpenSSH 8.3的源码包,用rpm-build打包成rpm包,再升级。一、源码包到OpenSSH官网https://www.openssh.com/,找到并下载源码包https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.3p1.tar.gz ,打开Release Notehttps:/
jqury 实现点击一个菜单,另一个展开的子菜单隐藏