Python-100-Days-master-第二周笔记
python100day学习第二周
# 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值
list1 = [1, 3, 5, 7, 100]
for index, elem in enumerate(list1):
print(index, elem)
文件后缀名
#返回一个文件的后缀名
def getSuffix(filename):
suffix = filename.rfind('.')
return filename[suffix+1:]
print(getSuffix("hello.txt"))
返回列表中最大和第二大的值
# 返回列表中最大和第二大的值
def max12(listname):
max1 = max(listname)
newlist = listname.remove(max1)
max2 = max(listname)
return max1,max2
result = max12([1,2,3,5,4])
print(result)
约瑟夫问题
# 约瑟夫环问题
# 30个数,开始循环,如果到9,则标记为0
def yuesefu():
persons = [1]*30
total_sum = 0
loc = 0
num = 0
while total_sum < 15:
if persons[loc]:
num += 1
if num == 9:
total_sum += 1
persons[loc] = 0
num = 0
loc += 1
loc %= 30
return persons
print(yuesefu())
python的==和is有区别,is比较两个对象的id,==比较值是否相等
def main():
x = y = -1
while True:
x += 1
y += 1
if x is y:
print('%d is %d' % (x, y))
else:
print('Attention! %d is not %d' % (x, y))
break
x = y = 0
while True:
x -= 1
y -= 1
if x is y:
print('%d is %d' % (x, y))
else:
print('Attention! %d is not %d' % (x, y))
break
if __name__ == '__main__':
main()
Python把一些频繁使用的整数对象缓存起来,保存到一个叫small_ints的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。Python把频繁使用的整数对象的值定在[-5, 256]这个区间,如果需要这个范围的整数,就直接从small_ints中获取引用而不是临时创建新的对象。因为大于256或小于-5的整数不在该范围之内,所以就算两个整数的值是一样,但它们是不同的对象
但是如果在同一模块中,那么是地址相同
a = 257
def main():
b = 257 # 第6行
c = 257 # 第7行
print(b is c) # True
print(a is b) # False
print(a is c) # False
if __name__ == "__main__":
main()
python的下划线小结
python的单下划线
如果是交互式情况下,单下划线表示上一条语句的输出结果
>>> "python"
'python'
>>> _
'python'
>>>
作为临时变量,在for循环中充当
i
for _ in range(5):
print(_)
名称前加单下划线表示私有(末尾加双下划线没什么影响),不强制,仅作为提示
# 前置单下划线对于类调用影响不大
# 但是如果是导包,则需在__all__中声明才可以调用
class Student():
def __init__(self,name,age):
self._name = name
self.age = age stu1 = Student("lp",18)
print(stu1._name)
print(stu1.age)
双下划线
前置双下划线
# 前置双下滑线才算比较好的设置保护
# 这时候需要._类名__属性名才能进行调用
class Student():
def __init__(self,name,age):
self.__name = name
self.age = age stu1 = Student("lp",18)
print(stu1._Student__name)
print(stu1.age)
首尾双下划线(好像没见到过尾部双下划线的)
一般是作为固定搭配__init__之类的
continue和pass的区别
a = 'python'
i = 2
for element in a:
if element == 'y':
pass
i = 3
else:
print(element+str(i))
"""
p2
t3
h3
o3
n3
"""
a = 'python'
i = 2
for element in a:
if element == 'y':
continue
i = 3
else:
print(element+str(i))
"""
p2
t2
h2
o2
n2
"""
在打开的文件中,首先最好使用with open("xxx.xx") as xxxx:这样的形式
然后对于read()和readline(),产生的是str,如果是readlines,则产生的是list
这里在同目录下创建test.txt,里面的内容为
# test.txt
1212121
21131241422141
2144121331
2131313123123
这里分别用不同的方法查看输出
with open("./test.txt") as fobj:
print(fobj)
print(type(fobj))
for line in fobj:
print(line)
with open("./test.txt") as fobj:
contents = fobj.read()
print("contents:",contents)
print("**********************")
print("type(contents):",type(contents))
print("**********************")
for line in fobj:
print(line)
这里你可能会奇怪我为什么这样输出,这是因为下面的print(line)不输出了
with open("./test.txt") as fobj:
contents = fobj.read()
print("contents:",contents)
print("type(contents):",type(contents))
with open("./test.txt") as fobj:
contents = fobj.readlines()
print("contents:",contents)
print("type(contents):",type(contents))
for line in contents:
print(line)
继续回到前置单下划线,如果此时想设置成私有的,那么可以使用getter和setter方法
getter和setter方法
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
# 访问器 - getter方法
@property
def name(self):
return self._name
# 访问器 - getter方法
@property
def age(self):
return self._age
# 修改器 - setter方法
@age.setter
def age(self, age):
self._age = age
def play(self):
if self._age <= 16:
print('%s正在玩飞行棋.' % self._name)
else:
print('%s正在玩斗地主.' % self._name)
def main():
person = Person('王大锤', 12)
person.play()
person.age = 22
person.play()
# person.name = '白元芳' # AttributeError: can't set attribute
if __name__ == '__main__':
main()
其实觉得这个getter和setter方法还是没什么用,因为还是可以用._的方法来调用
但是后面自己再去实现了一下前置双下划线,发现还是很有用的
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
person = Person("xxx",18)
person.name
请注意,下面我刻意把name打成了nam,调用的时候也必须使用.nam
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age
@property
def nam(self):
return self.__name
@nam.setter
def nam(self,nam):
self.__name = nam
person = Person("xxx",18)
person.nam
@property装饰器的作用:既要保护类的封装特性,又要让开发者可以使用“对象.属性”的方式操作操作类属性
注意
,不加@property不会变成getter方法,输出只会是类中的一个方法
可以查看下面两种输出
使用return方法:
class Person():
def __init__(self,name,age):
self.__name = name
self.age = age
def name(self):
return self.__name
def age(self):
return self.age
person = Person("xxx",18)
print(person.name)
print(person.age)
<bound method Person.name of <__main__.Person object at 0x000001B47B0E61F0>>
18
使用print方法
class Person():
def __init__(self,name,age):
self.__name = name
self.age = age
def name(self):
print(self.__name)
def age(self):
print(self.age)
person = Person("xxx",18)
print(person.name)
print(type(person.name))
print(person.age)
print(type(person.age))
# 这里age会自动识别成属性,而不是方法
person.age("hello")
person.age()
在上面的例子中,我们知道如果属性和方法重名,会自动识别为属性,不会像Java一样,当然我们一般也不会这样做,再看下面这两个例子会更清楚地理解为什么会有@property地getter方法,以及@修饰属性.setter方法,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
class Student():
def __init__(self,name,age):
self.name = name
self.age = age
def name(self):
print(self.name+"hello")
stu = Student("xxx",18)
print(stu.name)
stu.name()
class Student():
def __init__(self,name,age):
self.__name = name
self.age = age
def name(self):
print(self.name+"hello")
stu = Student("xxx",18)
print(stu.name)
学到这里,那同样把property函数也学习了一下
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
直接看例子
class Student:
def __init__(self):
self._age = None
def get_age(self):
print('获取属性时执行的代码')
return self._age
def set_age(self, age):
print('设置属性时执行的代码')
self._age = age
def del_age(self):
print('删除属性时执行的代码')
del self._age
age = property(get_age, set_age, del_age, '学生年龄')
student = Student()
# 注意要用 类名.属性.__doc__ 的形式查看属性的文档字符串
print('查看属性的文档字符串:' + Student.age.__doc__)
"""
查看属性的文档字符串:学生年龄
"""
# 设置属性
student.age = 18
"""
设置属性时执行的代码
"""
# 获取属性
print('学生年龄为:' + str(student.age))
"""
获取属性时执行的代码
学生年龄为:18
"""
# 删除属性
del student.age
"""
删除属性时执行的代码
"""
上例中,可一步一步调试,最后del student.age
,再查看student.age
静态方法暂时还是没感觉有什么用,比如下例可以直接调用
class Student():
def __init__(self,name,age):
self.name = name
self.age = age
Student('xxx',18).name
除了静态类,还可以在类中指定一个类方法为类
听起来很绕,实际上就是在已有的类中,新建一个方法,但这个方法是被@classmethod
修饰的,并且返回一个类,看下例(嗯,下例是py2.7,为此尝试anaconda安装py2.7并尝试用conda install nb_conda_kernels
这样的方法安装jupyter,虽然有py2.7的这个kernel,但是无法打开,所以最后使用了conda create -n py27 python=2.7 ipykernel
语句来添加py2.7)
class Data_test2(object):
day=0
month=0
year=0
def __init__(self,year=0,month=0,day=0):
self.day=day
self.month=month
self.year=year
@classmethod
def get_date(cls, string_date):
#这里第一个参数是cls, 表示调用当前的类名
year,month,day=map(int,string_date.split('-'))
date1=cls(year,month,day)
#返回的是一个初始化后的类
return date1
def out_date(self):
print "year :"
print self.year
print "month :"
print self.month
print "day :"
print self.day
r=Data_test2.get_date("2016-8-1")
r.out_date()
"""
year :
2016
month :
8
day :
1
"""
python没有真正的抽象类,也可以使用abc来达到抽象类的效果
Python-100-Days-master-第二周笔记的更多相关文章
- Python学习之旅--第二周--元组、字符串、运算、字典
一.元组 另一种有序列表叫元组:tuple.tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字: # Author:Tim Gu tuple = (" ...
- 《Linux内核分析》第二周笔记 操作系统是如何工作的
操作系统是如何工作的 一.函数调用堆栈 1.三个法宝 计算机是如何工作的?(总结)——三个法宝(存储程序计算机.函数调用堆栈.中断机制) 1)存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ...
- Python 学习日记(第二周)
从这周开始我就正式学习Python 语言了.以后每周都会有一篇有关于学习Python的见闻与大家分享! Python的安装 学习的第一步首先要有一个运行的环境.所以接下来介绍一下安装的步骤. 通过Py ...
- Python学习之旅--第二周--python基础
一.什么是pyc? 1.Python是解释性语言,那么.pyc是什么文件? 2.解释性语言和编译型语言区别: 计算机是不能够识别高级语言的,所以当我们运行一个高级别语言程序时,就需要一个&quo ...
- perl正则表达式第二周笔记
1.使用正则表达式修改文本 1.使用正则表达式修改文本 正则表达式的功能不只有查询,还可以对文本进行修改,例如替换 $var=~m/regex/i $var=~s/regex/replacement/ ...
- Python数据分析与展示[第二周]
matplotlib 有各种可视化的类构成 一般调用 matplotlib.pypolt 这个命令字库 相当于快捷方式 plt.plot(a) 只有一个一维列表 x轴充当列表索引 plt.ylabel ...
- python作业购物车(第二周)
一.作业需求: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4 ...
- python第三次作业-mooc笔记
1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程3.学习完成第0周至第4周的课程内容,并完成各周作业 4.提供图片或网站显示的学习进度 ...
- python核心编程第二版笔记
python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d 提供调试输出1.2 –O 生成优化的字节码(生成 ...
- 红帽学习笔记[RHCSA] 第二周
目录 红帽学习笔记[RHCSA]第二周 环境 第七课[网络配置相关] 在Vmware中添加网卡 将网卡添加到虚拟机上 关于网卡命名规则 配置网络 网络配置命令总结 更改hostname 关于SSH的一 ...
随机推荐
- scrapy --爬取媒体文件示例详解
scrapy 图片数据的爬取 基于scrapy进行图片数据的爬取: 在爬虫文件中只需要解析提取出图片地址,然后将地址提交给管道 配置文件中写入文件存储位置:IMAGES_STORE = './imgs ...
- buuctf 荷兰带宽数据泄露
荷兰带宽数据泄露 下载附件得一个conf.bin文件,这个文件是路由信息文件,题目并没有任何提示,我们先来测试一下最简单的,找username或password然后当作flag交上去,我们使用Rout ...
- 180度\360度sg90舵机的使用及代码程序
大部资料都是在网上找到网友大神所共享的,在网上找了几种舵机的,刚接触有点懵,之后找得多了就理解了,想要控制一个硬件就要先了解这个硬件.这里有介绍180度舵机和360度舵机的具体使用,有网上大神的程序, ...
- 一个模仿微信群聊的H5页面
开始 上半年小米Max发布的时候,做了一个在朋友圈传播的模仿微信的群聊界面H5页面:一群公司的大咖在群里聊小米Max,用户可以向大咖们提问,以此了解产品. 页面的主体是群聊对话,同时在对话中包含了很多 ...
- 打造专属自己的html5拼图小游戏
最近公司刚好有个活动是要做一版 html5的拼图小游戏,于是自己心血来潮,自己先实现了一把,也算是尝尝鲜了.下面就把大体的思路介绍一下,希望大家都可以做出一款属于自己的拼图小游戏,必须是更炫酷,更好玩 ...
- css创建叉和勾
a{ display: inline-block; width: 10px;height:5px; background: red;line-height: 0;font-size:0;vertica ...
- ubantu系统之jdk切换使用
安装 jdk7: $ sudo apt-get update $ sudo apt-get install openjdk-7-jdk 安装 jdk1.8:sudo add-apt-repositor ...
- 将本地项目上传到gitLab操作
在设置好SSH之后,执行下面的操作即可完成: git init // 初始化git status //查看提交文件状态git remote add origin git地址 // 连接 ...
- Spring Boot-@EnableWebMvc注解
作用:当配置类中添加了该注解了之后,就表示某个模块的自动配置就都失效了,全部都要自己配置 例如下面这个MVC模块的配置类 /** * @author:抱着鱼睡觉的喵喵 * @date:2020/12/ ...
- kubectl creat -f 创建pod时出错
如果创建yaml时候,sts中已经存在,但是get pod又查不到已经启动的pod可以这样 [root@k3master src]# kubectl get pod //查不到eureka NAME ...