观看b站"麦叔编程"笔记
链接:Python小技巧#4:__init__.py有什么用处?_哔哩哔哩_bilibili
tips:
python中列表用[],元组用(),字典用{}字典中的key是字符串
1:__name__ = '__main__'是做什么用的?
当该.py文件被调用的时候不执行,当前文件运行时就执行(调试用的)
2:如何用一条语句合并两个字典Dictionary
x = {'小明':88,'如花':86}
y = {'大美':99,'如花':87}
#适用于python3.5及以上
z = {**x, **y, '张三':100}
print(z)
# {'小明': 88, '如花': 87, '大美': 99, '张三': 100}
#Python 3.4及以下使用
z = x.copy()
z.updata(y)
print(z)
3个知识点:(1)合并语法;(2)键相同时,后一个覆盖前一个;(3)合并时还可以另外加入新的键值对
3.如何在python中执行外部命令?
import subprocess #从3.5开始
p = subprocess.run(['ls','-l'],capture_out=True)
print("=========")
print(p.stdout.decode('UTF-8'))
4. __init__.py有什么用处?
引用其他文件夹.py文件原理:每一个.py文件都是一个模块
让一个文件变成python的包,然后才可以通过文件夹名引用里面的module。
5. 判断一个List是否为空的正确方法?
a = [3]
if a:
print("List is not empty") # here
else:
print("List is empty")
6.For循环中如何访问元素下标?
scores = [100, 99, 95, 90, 89] #数组
for index, s in enumerate(scores): #使用enumerate将数组单个值变成下标和值的一个对
# print(s)
print('第{}:名{}'.format(index+1, s))
#或者第二种
#for index, s in enumerate(scores,start=1): #start=1代表下标从1开始
7.如何给字典按照Value排序?
>>> scores = {2:98, 1:87, 3:65, 4:95}
>>> sorted(scores.keys()) #按key由小到大排序
[1, 2, 3, 4]
>>> sorted(scores.keys(),reverse=True) #按key由大到小排序
[4, 3, 2, 1]
>>> sorted(scores.values(), reverse=True) #按values由大到小排序
[98, 95, 87, 65]
>>> scores.items()
dict_items([(2, 98), (1, 87), (3, 65), (4, 95)]) #按item(但由item中的key决定)由大到小排序
>>> sorted(scores.items())
[(1, 87), (2, 98), (3, 65), (4, 95)]
>>> sorted(scores.items(),key=lambda item:item[1]) 按item(但由item中的values,即第1个决定)由大到小排序
[(3, 65), (1, 87), (4, 95), (2, 98)]
>>> sorted(scores.items(),key=lambda item:item[1], reverse =True)
[(2, 98), (4, 95), (1, 87), (3, 65)]
>>> {k:v for k,v in sorted(scores.items(),key=lambda item:item[1], reverse=True)}
{2: 98, 4: 95, 1: 87, 3: 65}
8. python中有contains方法吗?
>>> a = 'this is maishu coding'
>>> b = 'maishu'
>>> a.contains(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'contains'
>>> str.__contains__(a,b) #规定__开头为私有方法,外部是不能用的
True
>>> b in a #正确用法:使用in和not in
True
>>> b not in a
False
>>> aa = [99, 97, 95] #在list中同样使用
>>> 95 not in aa
False
>>> 96 in aa
False
9.实例方法,类方法,静态方法的区别?
class Dog:
dogbook = {'黄色':30, '黑色':20, '白色':0}
def __init__(self, name, color, weight):
self.name = name
self.color = color
self.weight = weight
#此处省略若干行,应该更新dogbook的数量
#实例方法: 定义时,必须把self作为第一个参数,可以访问实例变量,只能通过实例名访问
def bark(self):
print(f'{self.name} 叫了起来')
#类方法:定义时,必须把类作为第一个参数,可以访问类变量,可以通过实例名或类名访问
@classmethod
def dog_num(cls):
num = 0
for v in cls.dogbook.values():
num = num + v
return num
#静态方法:不强制传入self或者cls, 他对类和实例都一无所知。不能访问类变量,也不能访问实例变量;可以通过实例名或类名访问
@staticmethod
def total_weights(dogs):
total = 0
for o in dogs:
total = total + o.weight
return total
print(f'共有 {Dog.dog_num()} 条狗')
d1 = Dog('大黄', '黄色', 10)
d1.bark()
print(f'共有 {d1.dog_num()} 条狗')
d2 = Dog('旺财', '黑色', 8)
d2.bark()
print(f'狗共重 {Dog.total_weights([d1, d2])} 公斤')
10.什么是lambda?
1)一句话的函数都可以用lambda表达式代替
3)可以匿名,也可以有名
4)语法糖衣:只是为了简单
5)格式:lambda x:x+1
1)格式:函数名 = lambda 输入:输出 (函数名 = lambda 参数:返回值)
f = lambda x,y: x+y
等同于
def f(x,y):
return x+y
2)排序经常用
scores=[99,87,98,85,50,21]
def filter(scores,func):
new_scores=[]
for s in scores:
if(func(s)):
new_scores.append(s)
return new_scores
pass
#函数生成器
def beishu(n):
return lambda x:x%n==0
print(filter(scores,lambda x:x%2==0))
print(filter(scores,lambda x:x%3==0))
print(filter(scores,lambda x:x%5==0))
bei3=beishu(3)##生成了一个函数
bei5=beishu(5)
bei2=beishu(2)
print(filter(scores,bei2))
print(filter(scores,bei3))
print(filter(scores,bei5))
#3 Sorted
ranking={'A':95,'B':99,'D':90,'C':87}
print(sorted(ranking.items(),key=lambda itm:itm[1],reverse=True))
11. append和extend有什么区别?
a = [1,2,3]
>>> b = [4,5,6]
>>> a.append(b) #直接把b放入a中,b是什么就怎么放
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> a = [1,2,3]
>>> a.extend(b) #是把b解开以后在放到a中 tips,因为list不会对数值进行计算,也可以直接a+b
>>> print(a)
[1, 2, 3, 4, 5, 6]
>>> c = (7,8) #对于元组同样解开后放入a中
>>> a.extend(c)
>>> print(a)
[1, 2, 3, 4, 5, 6, 7, 8]
12.把list和字符串大卸8块的方法(切片)
#完整格式 a[start:end:step]
# m a i s h u
# 0 1 2 3 4 5 6
#-6 -1 -5 -4 -2 -1
#以下同样适用于list,字符串,元组
#1.取单个元素 a[index]
#2.取子串,a[start:end] 注意不包括end
#3.start和end取负数 a[:-1]->'maish'; a[-1:]->'u'; a[-3:-1]->'sh'
#4.sart > end 怎么办 ->输出为空字符串''
#5.空的start或者end
#6. 可以用None代替空的start a[:]->'maishu'; a[2:None]->'ishu'
#7. step
#8. step为负数: a[::-1] a[::-1]->'uhsiam' 反向减一个
13.Getter, Setter, Property是什么鬼?
(Python Tip #13:Getter,Setter,Property是什么鬼?_哔哩哔哩_bilibili)
推荐使用person3注解方法
class Person:
def __init__(self, age):
self.age = age
zs = Person(33)
print(zs.age)
zs.age = 888
print(zs.age)
##age是一个public属性
##封装,多态和继承(面向对象编程)
##约定变量名前加下划线,表私有,不希望外面被用(虽然可以用)
class Person2:
def __init__(self,age):
self._age = age
zs = Person2(33)
print(zs._age)
zs._age = 888
print(zs._age)
#模拟jave中实现
class Person2:
def __init__(self,age):
self._age = age
def set_age(self, age):
if(age > 100):
self._age = 100
else:
self._age = age
def get_age(self):
if(self._age > 18):
return 18
else: return self._age
zs = Person2(13)
print(zs.get_age())
zs.set_age(888)
print(zs.get_age())
#正解 代码不直接访问gae函数,而是先访问property
#@property 相当于get方法,类实例时引用;
class Person3:
def __init__(self,age):
self._age = age
@property
def age(self): #由这个函数名age找到@age.setter方法
if(self._age > 18):
return 18
else: return self._age
@age.setter
def age(self, age):
if(age > 100):
self._age = 100
else:
self._age = age
zs = Person3(13)
print(zs.age)
zs.age = 888
print(zs.age)
#传统方法
class Person4:
def __init__(self,age):
self._age = age
def set_age(self, age):
if(age > 100):
self._age = 100
else:
self._age = age
def get_age(self):
if(self._age > 18):
return 18
else: return self._age
age = property(get_age, set_age)
14. Python中参数为None什么意思?
python函数参数为None的时候,比如 def req(self, b=None),是因为这个函数是一个封装函数,在没有调用他的时候他的参数需要加上None。如果不加None值,不调用函数他会报错。 一般会用在封装类或者框架里。比如说框架一般会有一个总的调用函数,总的调用函数启动,这次没有获取到值,执行到req函数时无法给req函数参数,那如果没有参数req函数就会报错。一般会报:‘req() missing 1 required positional argument: 'b'’但是如果参数为None就不会报错。如果程序执行到req参数传递成功的话,参数就不会是None了。 所以None是一个防止报错的机制。
15. Python赋值语句 if x is not None else 0
a = 2
a = 1 if a is not None else 0 #如果a不是None则赋值a=1,否则a=0
print(a)
#输出1
tips:'',{},[]不是None
# a = [] # 0
# a = {} # 0
# a = '' # 0
a = None # 5
b = 5 if a is None else 0
print(b)
16.其他笔记
pd读取csv文件:
(1)index_col
在默认为None的时候,pandas会自动将第一列作为索引,并额外添加一列。所以大多我们会使用index_col=0
,直接将第一列作为索引,不额外添加列。
(2)使用带标题的数据框时会出现差异,所以假设您的数据框 df
有标题!
-
header=None
pandas 自动将第一行df
(这是实际的列名)分配给第一行,因此你的列不再有名称 -
header=0
,熊猫首先删除列名(标题),然后为它们分配新的列名(仅当您在加载文件时传递 names = […….] )。read_csv( filepath, header = 0 , names = ['....' , '....' ...])