Juntao Tan的个人博客

争取为中文互联网留下点什么。


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

统计学习方法:感知机

发表于 2019-07-09 | 更新于: 2019-07-09
字数统计: 571 | 阅读时长 ≈ 3

注:代码和运行结果都是从jupyter notebook中导出的

导入所需要的第三方库

1
2
3
4
5
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
%matplotlib inline

导入数据(iris数据集是sklearn中自带的数据集)

1
2
3
4
5
6
# load data
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
df.label.value_counts()

2    50
1    50
0    50
Name: label, dtype: int64

选取两个特征sepal length和sepal width,绘制散点图

1
2
3
4
5
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

<matplotlib.legend.Legend at 0x1b17e936160>

png

数据处理:将pandas类型数据转换为np.array

1
2
3
data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:, :-1], data[:, -1]
y = np.array([1 if i == 1. else -1 for i in y])

定义模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Model():
def __init__(self):
self.w = np.ones(len(data[0])-1, dtype=np.float32)
self.b = 0
self.l_rate = 0.1
def linear_func(self, w, b, x):
return np.dot(x, w) + b
def fit(self, X_train, y_train):
finished = False
while not finished:
wrong_count = 0
for d in range(len(X_train)):
if y_train[d] * self.linear_func(self.w, self.b, X_train[d]) <= 0:
self.w = self.w + self.l_rate * y_train[d] * X_train[d]
self.b = self.b + self.l_rate * y_train[d]
wrong_count += 1
if wrong_count == 0:
finished = True
return "perceptron model"

1
2
3
4
perceptron = Model()
perceptron.fit(X, y)
print(perceptron.w)
print(perceptron.b)
[  7.8 -10. ]
-12.099999999999973

使用自己训练的模型做二分类

1
2
3
4
5
6
7
x_points = np.linspace(4, 7, 10)
y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]
plt.plot(x_points, y_)

plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.legend()

<matplotlib.legend.Legend at 0x1b17ecb4d68>

png

使用sklearn中自带的感知机模型

1
2
3
4
5
6
from sklearn.linear_model import Perceptron
clf = Perceptron(fit_intercept=False, max_iter=1000, shuffle=False)
clf.fit(X, y)

print(clf.coef_)
print(clf.intercept_)

[[  74.6 -127.2]]
[0.]


c:\python36\lib\site-packages\sklearn\linear_model\stochastic_gradient.py:183: FutureWarning: max_iter and tol parameters have been added in Perceptron in 0.19. If max_iter is set but tol is left unset, the default value for tol in 0.19 and 0.20 will be None (which is equivalent to -infinity, so it has no effect) but will change in 0.21 to 1e-3. Specify tol to silence this warning.
  FutureWarning)

绘制sklearn训练得到的感知机模型

1
2
3
4
5
6
7
x_points = np.arange(4, 8)
y_ = -(clf.coef_[0][0] * x_points + clf.intercept_) / clf.coef_[0][1]
plt.plot(x_points, y_)

plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.legend()

<matplotlib.legend.Legend at 0x1b17f046278>

png

C:\Python36\Lib\site-packages\sklearn\datasets\data

python中如何批量修改文件后缀名

发表于 2019-07-05 | 更新于: 2019-07-05
字数统计: 361 | 阅读时长 ≈ 1

需求背景

win10中的锁屏壁纸着实好看,想着能不能在本机中找到壁纸存放的目录,于是网上搜了一下,还真有。

壁纸文件存放的目录是

1
C:\Users\18856\AppData\Local\Packages\MicrosoftWindowsContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets

上面18856是我电脑上的账户名,只需要修改为你自己的账户名即可,其它的所有分级目录都相同。

切换到噶目录下后,发现所有文件都没有后缀名,不能直接用图片查看器打开,需要一个个修改后缀名为.jpg格式,但是手工是在是太麻烦,因此想着用Python批量修改。

实现

用os.path里面几个常用的API可以实现需求。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os
import sys

path_input = sys.argv[1]
ext_input = sys.argv[2]

components = path_input.split('\\')
path_new = ''

# 将原始单斜杠'\'转为双斜杠'\\'
for idx, item in enumerate(components):
if idx != (len(components) - 1):
path_new += item + '\\\\'
else:
path_new += item

# print(path_new)

files = os.listdir(path_new)
for file in files:
# 分隔文件名和后缀名
fullname = os.path.splitext(file)
newname = fullname[0] + ext_input
os.rename(path_new + '\\\\' + file, path_new + '\\\\' + newname)

运行
从命令行中运行,需要附带两个参数:

  1. 原文件所在的目录,将windows中文件资源管理器上的路径拷贝过来;
  2. 目标后缀名,如.jpg

运行示例

1
2
python batch_rename.py C:\Users\18856\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\As
sets .jpg

参考文章

  • https://www.runoob.com/python/att-string-split.html
  • https://www.cnblogs.com/wuxie1989/p/5623435.html
  • https://blog.csdn.net/weixin_40449300/article/details/83184928

安装jupyter notebook和修改字体

发表于 2019-07-02 | 更新于: 2019-07-02
字数统计: 335 | 阅读时长 ≈ 1

安装 jupyter notebook

jupyter notebook 有两种方式安装:一种是通过 Anaconda,Anaconda里面已经集成了jupyter notebook;另一种是通过pip install安装,本文中我采用的是第二种安装方法。

我Windows系统中只安装了Python3,因此控制台中输入python就指向Python3,如果系统中Python2和Python3共存,那么在控制台中可能需要输入python3,因为官方建议在Python3下面安装jupyter notebook。

在控制台中输入下面命令安装jupyter notebook:

1
2
python -m pip install --upgrade pip
python -m pip install jupyter

安装需要花一定时间,等成功之后,在控制台输入:

1
jupyter notebook

启动jupyter notebook。然后选择一个目录,点击new就可以新建Python文件了。

配置 jupyter notebook 主题和字体

这里首先需要安装一个第三方包jupyter-themes:

1
pip install jupyterthemes

github仓库中有每个参数(包括主题、字体、字体大小等)的详细介绍和如何配置,如果有需要可以耐心研究研究。

下面这个配置可以比较好的满足需求。

1
jt -t oceans16 -f fira -fs 13 -cellw 90% -ofs 11 -dfs 11 -T

直接在控制台中输入上述命令,接着重新启动jupyter notebook就可以更新设置了。

最后的效果是这样的:

配置效果

参考文章

  • https://blog.csdn.net/qq_30565883/article/details/79444750
  • https://jupyter.org/install.html

如何删除github仓库中某个文件或者文件夹

发表于 2019-06-04 | 更新于: 2019-06-04
字数统计: 262 | 阅读时长 ≈ 1

从远处clone仓库到本地

在本地任意找一个文件夹,鼠标右键打开git bash,将远程仓库clone到此文件夹下面。

1
git clone <仓库的git地址>

进入到仓库目录中

1
cd <仓库名>

删除文件夹

如果文件夹名称是单独的英文单词,不带有空格,那么输入:

1
git rm -r <文件夹名>

如果文件夹名称是中文名或者带有多个英文单词但是使用空格分隔,那么输入

1
git rm -r '<文件夹名>'  # 同前面的区别是多了单引号,可以使用tab补全文件夹名称

删除文件

如果只是删除某个特定文件的话:

1
git rm <文件名全程>  # 包含文件名+后缀

如果需要批量删除某类后缀名的文件

1
git rm *.<后缀名> # e.g. git rm *.md

将修改提交到远程仓库

1
2
3
git add *
git commit -m "输入提示信息"
git push origin master

搞定!

HelloWorld of Keras

发表于 2019-05-17 | 更新于: 2019-09-08
字数统计: 878 | 阅读时长 ≈ 4

mnist_cnn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# -*- coding: utf8 -*-

# "Hello World" of Keras in image classification task

from __future__ import print_function # 在Python2的代码中可以使用Python3的print函数,即需要加上括号
import keras
from keras.datasets import mnist
from keras.models import Sequential # 序列模型,可以封装各种网络层: 卷积层、池化层、全连接层、dropout等
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K # Keras是一个高层API,后端使用TensorFlow或者Theano

batch_size = 128
num_classes = 10
epochs = 12 # 12个epoch足够训练好模型

img_rows, img_cols = 28, 28 # mnist dataset中image的大小

# 如果第一次跑,会通过url方式从amazon下载mnist.npz;如果已经下载过了,那么直接加载本地mnist.npz
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 根据不同的后端,将图片转换为不同的格式,TensorFlow是channel_last
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) # 通道为1
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)

# 将每个pixel的类型从integer转为float32,使除法计算更加精确
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

# 将0-255范围的pixel值转化到0-1
x_train /= 255
x_test /= 255

# 如果后端是TensorFlow
print('x_train shape:', x_train.shape) # 输出(60000, 28, 28, 1)
print(x_train.shape[0], 'train samples') # 输出60000
print(x_test.shape[0], 'test samples') # 输出10000

# 每个y_train或者y_test本来是一个整数表示每一类,现转换为one-hot encoding
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# 实例化一个序列模型
model = Sequential()
# Conv1
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
# Conv2
model.add(Conv2D(64, (3, 3), activation='relu'))
# Pool1
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
# 将maxpooling后的64个activation map 全部拉伸为一个向量
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
# 用softmax函数将logits转为每个类别的概率
model.add(Dense(10, activation='softmax'))

# 设置损失函数,优化器,度量标准
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])

# 训练模型
# verbose=1 展示详细的训练过程
# verbose=0 只显示最后结果,不展示过程
# verbose=2 每个epoch输出一条信息,不展示详细的训练过程
# validation_data会在每个每个epoch结束后计算当前模型的准确率,validation_data不参与训练
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=2,
validation_data=(x_test, y_test))

# 在测试集上测试模型效果
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test Accuracy:', score[1])

训练过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples

Epoch 1/12
- 248s - loss: 0.2778 - acc: 0.9140 - val_loss: 0.0612 - val_acc: 0.9800
Epoch 2/12
- 219s - loss: 0.0982 - acc: 0.9708 - val_loss: 0.0433 - val_acc: 0.9857
Epoch 3/12
- 212s - loss: 0.0766 - acc: 0.9776 - val_loss: 0.0354 - val_acc: 0.9876
Epoch 4/12
- 226s - loss: 0.0653 - acc: 0.9806 - val_loss: 0.0342 - val_acc: 0.9879
Epoch 5/12
- 221s - loss: 0.0573 - acc: 0.9828 - val_loss: 0.0307 - val_acc: 0.9896
Epoch 6/12
- 230s - loss: 0.0539 - acc: 0.9834 - val_loss: 0.0286 - val_acc: 0.9907
Epoch 7/12
- 224s - loss: 0.0490 - acc: 0.9850 - val_loss: 0.0280 - val_acc: 0.9901
Epoch 8/12
- 229s - loss: 0.0475 - acc: 0.9856 - val_loss: 0.0300 - val_acc: 0.9904
Epoch 9/12
- 249s - loss: 0.0465 - acc: 0.9862 - val_loss: 0.0286 - val_acc: 0.9906
Epoch 10/12
- 257s - loss: 0.0423 - acc: 0.9866 - val_loss: 0.0261 - val_acc: 0.9910
Epoch 11/12
- 243s - loss: 0.0393 - acc: 0.9883 - val_loss: 0.0313 - val_acc: 0.9903
Epoch 12/12
- 277s - loss: 0.0413 - acc: 0.9877 - val_loss: 0.0266 - val_acc: 0.9907
Test loss: 0.026646837043244158
Test Accuracy: 0.9907

Process finished with exit code 0

如果是第一次运行,会从 https://s3.amazonaws.com/img-datasets/mnist.npz 下载数据集,Windows会存放在c://Users//<User name>//.keras/datasets下面;Linux会存放在home/.keras/datasets下面。

cifar10_cnn.py

1
2


训练过程


参考

  • Keras Model API: https://keras.io/models/model/
  • mnist_cnn.py: https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py
  • cifar10_cnn.py: https://github.com/keras-team/keras/blob/master/examples/cifar10_cnn.py
  • https://www.cnblogs.com/lfri/p/10485597.html

李学龙老师在2017届本科生毕业典礼上的讲话

发表于 2019-05-04 | 更新于: 2020-02-28
字数统计: 2.5k | 阅读时长 ≈ 8

演讲原文

尊敬的各位老师、各位家长,各位师弟、师妹们:

大家早上好!

我想汇报和分享的很多故事其实都是“曾经”,但是我今天更想用“这一年”来说。曾经有一首歌叫《同桌的你》,曾经有一部电影叫《大话西游》,曾经有一本书叫《未来之路》,曾经在这一年我到了合肥。大约坐了将近40个小时的火车,其实完全可以加上一个注释:怀抱着光荣、梦想、期望、憧憬,但其实对我来说,当时旅途就是旅途本身,至多是一种坚持,至少当时我是这么认为的。在这一年,在北方长大的我,第一次见到了竹子,它顽强地在并不富饶的土地上茁壮成长;在这一年很多来自南方的同学,他们第一次见到了水在极端情况下的迸发和绽放。1994年的漫天大雪里,我现在还能记得很多穿着单衣的同学在欢呼雀跃。 这一年,我18岁之前建立的所有自信心都被打碎了,荡然无存,如樯橹灰飞烟灭,因为在我曾经自诩很擅长的每一个方面都有N多的人比我强。当我跟他们一样穿着拖鞋、端着饭盆去食堂的时候,总会有人说“看!这是国奥金牌,这也是国奥金牌,这是某个省的状元,这又是某个省的状元。”其实给人压力最大的并不是你知道有人比你优秀,而是你每天都要和他们在一起;也不是说你觉得比你优秀的人比你更努力,而是你发现其实他们不太努力的时候还是比你优秀。在这一年,很幸运的,我跟他们一样有了一个让我终生引以为傲、倍加珍惜的名字——科大人!

科大人很拼,江湖传言“穷清华,富北大,不要命的上科大”。但科大就是科大,科大有自己的秉持、自己的传统、自己的文化、自己的理念,我们其实没有必要去跟别人去比。科大人很萌,像“天使路”、“勤奋路”这样的名字,如果不是情商和智商的终极极品爆发大概是想不到的。科大人很执着,1995年毕建忠(9304/9315校友)和我分别任校学生会东西区体育部长的时候,我们(重新)启动了“巾帼杯”女子足球赛,听说一直踢了二十几年,到现在还有。科大人很团结,这个不需要多说,等大家到新的学习和工作岗位上,大家自然会知道,我保证。其实科大人还有很多共同的禀赋和标签,刚才蒋书记和校长也都提到了,像“红专并进,理实交融”其实已经融进了科大人的血脉,已经刻入了科大人立德树人的骨髓。

我是早上三点半的航班到的合肥,我当时在想跟大家讲点什么呢?其实我想了讲“知道,不知道,知不道,道不知”的故事,或者给大家讲“知足,不知足,知不足”的故事。后来想了想,还是不讲这些了。因为我的资历和经历也比较有限,很多故事也是听别人讲的。所以在毕业典礼的时候,我想给大家讲两个我会对毕业生说的我的担心吧。

首先,我担心大家会以为社会上和大学里是一样的。其实我们看一下大学,从中国古代的太学到西方古典模式的大学到中西方现代模式的大学,大学始终是这么一个存在,它鼓励我们去弘扬我们的品德、砥砺我们的品格、开拓我们的视野、激发我们的潜力,让我们不断地完善和更新,达到一种更好的自我,趋于完美和完善的境地。虽然大学的入门门槛在不断地调整,但大学始终是一个象牙塔,它是社会少数精英阶层的消费。但是当我们迈向社会的时候,我们会发现,盖人生历程,大抵逆境居十之六七,顺境亦居十之三四,而顺逆两境又常相间,我们会碰到很多的困难。为什么呢?因为社会对年轻人的宽容和忍让、理解和支持同大学是不一样的。“物可瞬间无主,人须时时有心”,我们能保证不变初心,在我们的追求和志向不被外物所改变的情况下,我建议大家学会适应。达尔文在《物种起源》里说,得以生存的不见得是最强大的,也不见得是最智慧的,但一定是最适合环境的。唯一不变的事情就是变化本身,所以我送给大家的第一个词是“适应”,并请大家记住,适应绝不是随波逐流。

第二个担心是,我担心大家认为课本里学到的知识可以让大家出去生活,至少是生存了,因为生活和生存是两个概念。其实课本里的知识如果是完备的话,我们没有必要去建立一所实体大学。事实上课本里的知识、大家学过的知识很可能是不完备的,不齐整的,甚至可能是不正确的。以光学为例,我有两个透镜,有一个光轴,这边有个蜡烛,这边有个屏,蜡烛成什么样的像,这个我们可以在课本中学到,但是你在做一个实际系统的时候,这两个透镜能严格地同轴吗?或许不能!这个时候该怎么解决,课本里似乎不会告诉你。那么学电的话,我们学电子管、晶体管,并不表示我们要去用它,我们是要知道历史上发生过什么样的事情,我们应该怎么样去学习,我们要学习“学习的本领”,我们去归纳总结,去提炼升华。其实,科学研究本身至少有两个目的。第一个目的是实际的应用,去解决实际的问题。我们理工科的学生,尤其应该如此,绝对不能纸上谈兵。那么另一个目的就是满足人类对世界的好奇心。我们知道在电口(电学)上很著名的故事。当法拉第发现电磁感应定律的时候,他并不知道能做什么;麦克斯韦预言电磁波存在的时候,法拉第刚刚去世;当赫兹证明电磁波存在的时候,麦克斯韦又刚刚去世;当马可尼开始进行无线通讯的时候,赫兹也去世了。但是我们不能忘记科学史上这一步一步好奇心的驱使。其实能够鼓励创新的年代并不是特别的多,我们常说“千里马常有,而伯乐不常有”。我们看一看在欧洲,从后希腊到罗马到文艺复兴,其实创新沉睡了一千年。在中国我们有卷帙浩繁的经史子集,我们几乎可以从中间找到现在的任何一个发现或发明的原始的雏形,但是我们必须要承认,我们的技术是多于科学的,我们没有能够把炼丹术发展成化学,没有能够把观星术发展成天文学。所以在今天,在全国、全社会鼓励创新驱动发展的时候,我想大家还是非常幸运的。所以我想送给大家第二个词是“好奇”,而且好奇绝不是随心所欲。

我个人并不是特别推崇“人情练达即文章”,但是我坚信“世事洞明皆学问”。我想在大学的五年里(现在是四年制),大家至少学会了一个人的时候怎么样去平静、去思考,两个人的时候怎么样去合作、去争论,三个人的时候如何去协调、去平衡。其实我们担心的事情还很多,我们担心大家有成绩的时候妄自尊大,担心大家碰到困难的时候妄自菲薄。正因为大家很优秀,所以我们的担心才很多。

15年前的毕业典礼,我是博士生的毕业代表,到现在我还记得当时我的发言,我说“春来几度,苍翠依旧,于无声处,却已见茁壮。而今我们将成为科大的历史,但母校永远是我们心中的一座丰碑,上面镌刻着老师的关爱、同学的友情,和我们的点点滴滴……”很快大家就要离开这个校园,可能还会离开这个城市,或许很多人可能还会短期或长期离开我们的祖国,但是我深信大家或早或晚一定会回来!我是毕业6年之后回到合肥,我没有去会场,我直接打车到了黄山路的一个小饭店,进去之后,老板一句不经意的问候“很久没见了”,让我“泪飞顿作倾盆雨”,刚才在我们的校旗传过来的过程中,我心里就是这样的感觉。

我想大家一定会记得这一年,虽然这一年以后也会成为曾经,但是大家一定会记得在这一年大家收获了母校、老师、师兄师姐们的一些不可辜负的爱和期望。如果每一位科大人都是一颗闪亮的星,那么我们希望以一颗颗星的光芒去引领整个星河璀璨、瀚海星云的梦想。谢谢大家!

演讲视频

  • 李学龙(946)校友在2017届本科生毕业典礼上的讲话(节选)

写出pythonic的代码

发表于 2019-05-04 | 更新于: 2019-05-04
字数统计: 149 | 阅读时长 ≈ 1

列表遍历

Pythonic

1
2
3
4
names = ['juntao', 'xiaojun', 'mingming', 'haohao']
# 查找名字列表中带有字母'm'的名字
m_name = [name for name in names if 'm' in name]
print(m_name)

不要用循环写!

1
2
3
4
5
m_name = []
for name in names:
if 'm' in name:
m_name.append(name)
print(m_name)

字典遍历

Pythonic

1
2
3
4
exam_detail = {'juntao': 44, 'xiaojun': 88, 'mingming': 99, 'haohao': 22}
# 找出及格的学生及其分数
score_greater_than_60 = {k: v for k, v in exam_detail.items() if v >= 60}
print(score_greater_than_60)

不要这样写!

1
2
3
4
5
score_greater_than_60 = {}
for k, v in exam_detail.items():
if v >= 60:
score_greater_than_60[k] = v
print(score_greater_than_60)

参考文章

  • 一些 pythonic 的代码实例:https://github.com/mikeckennedy/write-pythonic-code-demos
  • https://blog.csdn.net/g8433373/article/details/80709116

一些Python语法

发表于 2019-05-01 | 更新于: 2019-05-04
字数统计: 600 | 阅读时长 ≈ 2

关键字 global

global关键字主要目的是为了在函数中使用全局变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
count = 10

def modify_count():
temp_count = 20
print('local variable: ', temp_count)
global count
print('global variable: ', count)
count = 100
print('after modified: ', count)
return

print('before modify_count(): ', count)
modify_count()
print('after modify_count(): ', count)

输入结果:

1
2
3
4
5
6
7
before modify_count():  10
local variable: 20
global variable: 10
after modified: 100
after modify_count(): 100

Process finished with exit code 0

阅读全文 »

pycharm在需要输入命令行参数时如何调试

发表于 2019-04-30 | 更新于: 2019-04-30
字数统计: 227 | 阅读时长 ≈ 1

1. 前言

在 pycharm 中进行调试,一般的做法是:先设置断点,然后开始调试程序。调试过程中选择step over, step into, step out, resume program等操作。

但是当程序需要从命令行中读取参数时,该怎么调试呢?

如果和之前一样,设置断点,然后开始调试,但在这种做法下,程序没有从命令行中获取到参数;如果在 pycharm 的 teminal中输入 python xxx.py -x xx -y yy -z zz,这种做法会直接运行完程序,无法在断点处停下来。

2. 解决方法

在 pycharm 中选择 Run -> edit configurations,然后在parameters中填入需要设置的命令行参数,这时候不需要输入python xxx.py。点击apply然后OK。

然后在代码中就可以直接 debug 了,会在断点处停下来。

参考文章

  • https://blog.csdn.net/wishchin/article/details/78560725

pycharm调试

发表于 2019-04-29 | 更新于: 2019-04-29
字数统计: 81 | 阅读时长 ≈ 1

pycharm中调试功能按钮说明列表

竖排

  • Resume Program(F9): 运行到下一个断点。

横排

  • step into(F7)和step into my code(Shift+Alt+F7之间的区别:前者会进入到一些系统函数内容,后者只会进入自己定义的函数内部。

参考文章

  • pycharm调试功能
1…456
Juntao Tan

Juntao Tan

记录一些重要的技术点,方便自己查阅,也希望能够帮助到大家。

60 日志
6 分类
87 标签
GitHub LinkedIn Zhihu Douban E-Mail
0%
© 2019 — 2022 Juntao Tan, all rights reserved. | Site words total count: 50.9k
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
本站总访问量 次 | 有 人看过我的博客
Hosted by GitHub Pages