DataWhale暑期夏令营学习笔记 一
一、Python的环境配置
以下链接有详细的环境配置教程,由DataWhale开源项目聪明办法学 Python 第二版提供。
聪明办法学 Python 第二版 环境配置教程
环境配置时需要注意的点:
1.如果电脑曾经安装过Anaconda相关的东西,重新安装时一定要把原来的卸载干净,卸载后检查相关的文件、文件夹、已配置的环境变量等有没有残留。
卸载教程链接: 详细卸载Anaconda
2.安装路径不要有中文,不要有中文,不要有中文!!!
3.配置环境变量时,要配置系统变量,不要使用用户变量,变量路径不要有特殊字符。
4.如果环境配置后出现问题,实在解决不了可以选择卸载干净后重装。
二、Python 基本常用语法
1. print( ) 与 注释
1.1 输出内容方法print();
print("hello, world")
运行结果:hello, world
每一个print()会默认换行。
print("Data")
print("whale")
运行结果:
Data
whale
若不想换行则:print(“你要输出的内容”, end=“”),默认end=“\n”。
\t :表示空4个字符,类似于文档中的缩进功能,相当于按一个Tab键。
\n :表示换行,相当于按一个回车键。
\n\t : 表示换行的同时空4个字符。
print("Data", end="")
print("whale")
运行结果:Datawhale
print( )中多个内容以空格分隔。
print("Data", "whale")
运行结果:Data whale
若要修改内容间的分隔符,可以使用sep参数,比如改成以 * 连接,可以传入参数sep=“*”,默认sep=" "。
print("Data", "whale", sep="*")
运行结果:Data*whale
1.2 单行注释:使用 # 开头,# 后面的内容不会被当做代码,只能写在一行中
print("Datawhale") # for the learner,和学习者一起成长
运行结果:Datawhale
如下示例,在print(“prepare to be smart”)前加 # 则 # 后面内容不会被当作代码运行。
print("p2s")
# print("prepare to be smart")
运行结果:prepare to be smart
在写代码的时候一定不要图省事不写注释,注释的作用在于记忆的唤醒和方便对代码快速的理解,方便自己也方便他人。
2. 列表与字典
2.1 列表
列表是一种可变序列,可以将其理解为一个容器,容器的唯一作用就是打包、解包、内容传递。
以下是一个列表的定义。
p2s = ["learn", "python", "the", "smart", "way"]
print(p2s)
运行结果:['learn', 'python', 'the', 'smart', 'way']
列表的取值可以通过在 [ ] 中传入要取值的位置进行取值操作。
print(p2s[1], p2s[0], p2s[-1], p2s[-2])
运行结果:python learn way smart
另一种是数据切片的方式,遵循左闭右开的原则,默认是从0开始到-1结束,-1表示列表的最后一个元素,切片格式为:[start:stop:step]。
print(p2s[0:2]) # 切片 左闭右开区间
print(p2s[2:]) # 起始:0,结束:-1
运行结果:
['learn', 'python']
['the', 'smart', 'way']
2.1 字典:键值对的集合
创建一个集合,并通过 add( ) 方法向集合中添加元素,集合的值不可变且不可重复。
dw_set = set() # 集合
for i in "Datawhale":
dw_set.add(i)
print(dw_set)
运行结果:{'e', 'w', 'h', 'a', 't', 'D', 'l'}
以下是字典的创建,格式为 {“key”: “value”} 即 {“键”: “值”} 。
dw_dict = {"d":"Data", "w":"whale"} # key:value
print(dw_dict["d"], dw_dict["w"], sep="")
运行结果:Datawhale
字典的更新方式如下:
dw_dict["w"] = "Whale"
print(dw_dict)
运行结果:{'d': 'Data', 'w': 'Whale'}
3. 条件判断和循环语句 if and for
3.1 条件判断语句 if
这里引入了知乎的一个小笑话: 程序员买西瓜和番茄的笑话
def 买西瓜(num):
return f"{num}个西瓜"
def 买番茄(num):
return f"{num}个番茄"
看到番茄 = True
# 下班了
西瓜 = 买西瓜(1)
if 看到番茄:
西瓜 = 买西瓜(2)
print(f"带了{西瓜}回家")
输出结果:带了2个西瓜回家
# 女朋友心想
西瓜 = 买西瓜(1)
if 看到番茄:
番茄 = 买番茄(2)
print(f"带了{西瓜}和{番茄}回家")
输出结果:带了1个西瓜和2个番茄回家
3.2 循环语句for
以下是一个循环示例。
for row in range(1):
for col in range(3):
print("🐳", end="")
print()
运行结果:
🐳🐳🐳
🐳🐳🐳
🐳🐳🐳
split()方法可以将字符串按照你所制定的字符进行分割,只需传入你指定的分隔符即可,比如将字符串以 , 为分割符进行分割,“learn,python”.split(“,”),默认为空格string.split(" ")。
for string in "learn python the smart way".split():
print(string)
运行结果:
learn
python
the
smart
way
print("我,秦始皇,V50,吃肯德基".split(","))
运行结果:['我', '秦始皇', 'V50', '吃肯德基']
4.自定义函数 与 return
4.1 自定义函数
以 Rectified Linear Unit (ReLU) 函数为例,其数学表达式为:
f
(
x
)
=
{
x
,
x
>
0
,
0
,
x
≤
0.
f(x)=\begin{cases}x, x>0, \\0, x≤0.\end{cases}
f(x)={x,x>0,0,x≤0.
用python两种自定义函数的方式进行实现:
方式一:
def ReLU(x): # f(x)
if x > 0:
return x
return 0
print(ReLU(-9))
输出结果:0
方式二:
relu = lambda x: max(x, 0)
print(relu(-9))
输出结果:0
4.2 回调函数
回调函数学习链接: 回调函数
5. 深度抄袭and浅度抄袭
5.1 直接赋值
这里是python区别于C语言的点,python是通过指针进行赋值,a指向列表的首地址,将a的值赋给b,实际上是让b也指向列表的首地址,这时候a和b指向的是同一个值,改变其中一个,另一个也会改变。
a = [1, 2, 3, [4, 5]]
b = a
id(a) == id(b), id(a)
运行结果: (True, 1920419377408)
5.2 浅度抄袭
通过copy( )方法可以将 a 的所指向的列表拷贝一份新的,然后让 c 指向这份新的列表,但是列表中如果还嵌套列表,实际上列表中所嵌套的列表也是一个指针,这种copy( )方法只能拷贝第一层的列表,不能够把列表中嵌套的列表的值也重新拷贝一份,因此用copy( )方法拷贝出的新的列表中所嵌套列表的地址依旧没有改变,改变新列表中嵌套列表的值,旧的列表中嵌套列表的值依旧会跟随改变。
c = a.copy() # a:v1.0
a.append(6) # a:v2.0
print(f"b: {b}\nc: {c}")
运行结果:
b: [1, 2, 3, [4, 5], 6]
c: [1, 2, 3, [4, 5]]
print(f"a[3] => {a[3]}\n")
a[3].append(7) # a:3.0
print(f"b: {b}\nc: {c}")
运行结果:
a[3] => [4, 5]
b: [1, 2, 3, [4, 5, 7], 6]
c: [1, 2, 3, [4, 5, 7]]
5.3 深度抄袭
使用copy.deepcopy( )方法,可以将原数据及其嵌套数据全部重新拷贝一份。
import copy
d = copy.deepcopy(a)
a[3].append(8)
print(f"b: {b}\nc: {c}\nd: {d}")
输出结果:
b: [1, 2, 3, [4, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], 6]
c: [1, 2, 3, [4, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]]
d: [1, 2, 3, [4, 5, 7, 8, 8], 6]
6. 面向对象:托马斯小火车与它的对象们
from random import choice
import time
from tqdm import tqdm
from IPython.display import display, HTML
# 创建火车类
class Train:
def __init__(self, name, *goods, naughty=True):
self.name = name # 火车的名字
self.goods = goods # # 火车所带的商品
self.naughty = naughty
def __getitem__(self, idx):
return self.goods[idx]
def __len__(self):
return len(self.goods)
def info(self):
if self.name == "托马斯小火车":
return f"Hi,我是{self.name},Cinders and ashes!"
return f"Hi,我是{self.name}"
def 发车(self, string):
print(f"{string},上山!") # f-strings
for _ in tqdm(range(30)):
pass
display(HTML("<p>聪明办法学Python</p>"))
Edward = Train("爱德华", 1, 2.5, 9, 114, 514, naughty=False) # 实例化
Edward.info()
运行结果: 'Hi,我是爱德华'
len(Edward)
运行结果:5
a, b= Edward[3], Edward[4] # 解包与打包 (114, 514) => a, b
print(f"hello {b}") # f-strings
运行结果: hello 514
货物 = ["邮件", "大米", "煤矿", "劳斯莱斯"]
托马斯 = Train("托马斯小火车", *货物, naughty=True)
托马斯.info()
运行结果:'Hi,我是托马斯小火车,Cinders and ashes!'
len(托马斯)
运行结果:4
托马斯[2]
运行结果:'大米'
托马斯.发车("AE86")
运行结果:
AE86,上山!
100%|██████████████████████████████████████████████████████████████████████████| 30/30 [00:00<?, ?it/s]
其中的 ‘f-string’ 是一个很好用的语法。
a = 10
print(f"{a}")
运行结果:10
7. 更多 Python 的学习资料请关注《聪明办法学Python 第二版》
Baseline代码精读学习笔记请关注后续:DataWhale暑期夏令营学习笔记 二
笔记 二 链接: DataWhale暑期夏令营学习笔记 二