Python日常总结

发布时间:2024-12-17 18:42

旅行总结:结束时总结旅行亮点和遗憾 #生活技巧# #自驾游建议# #自驾游旅行日记模板#

Python日常总结

Python中定义全局变量

代码:

A = 0 B = [0] def fun1(A, B): A += 1 B[0] += 1 fun1(A, B) print 'after fun1 %d %s' % (A,B) def fun2(): global A A += 1 B[0] += 1 fun2() print 'after fun2 %d %s' % (A,B) 123456789101112131415

输出:

after fun1 0 [1] after fun2 1 [2] 12

fun1中,A作为基本类型(int)是值传递,B不是基本类型(list)则是引用传递,所以执行后全局的A未变但B变了;

(如果熟悉C++就很容易理解,类似的概念:指针、引用、深拷贝、浅拷贝等)

(注意,与C++不同,Python中字符串str为基本类型)

fun2中,使用Python的关键字global才可以在函数内操作全局变量A,但B不需要global却能直接使用,这样可以避免一些“自以为是”的逻辑错误;

(注意,如果仅仅访问而不修改,在函数内是可以不用global直接使用的,比如在fun2中只是print A)

有了上面的理解后,我们来分析下在Python中怎么用全局变量好:

首先,使用基本类型的全局变量需要在每个操作它的函数、类里面用global声明还是挺麻烦的;

列表或元组呢,访问的时候用数字索引会降低代码的可读性;

用字典(dict)则可以解决上面两个问题,在简单的程序中dict应该是很合适的;

但是,在复杂的代码中如果需要对全局变量的修改进行一定的控制,或者在多组多个线程每组共享同类型但不同值的全局变量时,dict就无法胜任;

综上,个人认为自定义一个类来保存所有的全局变量是最好的方法:

简单时就直接访问成员变量;

需要控制时就声明为私有变量,用成员函数访问和修改;

多组多线程分开共享时就每组new一个新实例即可;

示例一:
调用其他文件的函数

#common.py class MyGlobal: def __init__(self): self.A = 0 self.B = [0] GL = MyGlobal() #main.py from common import * def fun(): GL.A += 1 GL.B[0] += 1 fun() print 'after fun %d %s' % (GL.A,GL.B) #执行./main.py after fun 1 [1]

1234567891011121314151617

示例二:
多线程操作(不太懂哎!)

#common.py import threading class MyGlobal: def __init__(self, i, setname): self.setname = setname self.A = i self.B = [i] #main.py from common import * def fun_trd(gl): print '%s %d %s' % (gl.setname,gl.A,gl.B) #两组,每组三个线程 trds = [] for i in range(0,2): setname = 'SET%d' % i gl = MyGlobal(i, setname) for k in range(0,3): t = threading.Thread(target=fun_trd, args=(gl,)) t.setDaemon(True) t.start() trds.append(t) for t in trds: t.join() #执行./main.py SET0 0 [0] SET0 0 [0] SET0 0 [0] SET1 1 [1] SET1 1 [1] SET1 1 [1]

1234567891011121314151617181920212223242526272829303132

python出现np.reshape(-1)

举几个例子或许就清楚了,有一个数组z,它的shape属性是(4, 4)

z = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) z.shape (4, 4) z.reshape(-1) z.reshape(-1) array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) z.reshape(-1, 1) 12345678910

也就是说,先前我们不知道z的shape属性是多少,但是想让z变成只有1列,行数不知道多少,通过z.reshape(-1,1),Numpy自动计算出有16行,新的数组shape属性为(16, 1),与原来的(4, 4)配套。

z.reshape(-1,1) array([[ 1], [ 2], [ 3], [ 4], [ 5], [ 6], [ 7], [ 8], [ 9], [10], [11], [12], [13], [14], [15], [16]])

1234567891011121314151617

z.reshape(-1, 2)
newshape等于-1,列数等于2,行数未知,reshape后的shape等于(8, 2)

z.reshape(-1, 2) array([[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8], [ 9, 10], [11, 12], [13, 14], [15, 16]]) 123456789

同理,只给定行数,newshape等于-1,Numpy也可以自动计算出新数组的列数。

网址:Python日常总结 https://www.yuejiaxmz.com/news/view/501442

相关内容

python如何改变日常生活
Python-Docx:Word与Python的完美结合
利用Python自动化日常任务
如何使用 Python 自动化日常任务
轻松实现日常任务自动化的6个Python脚本
Python编程:解锁日常生活与职业发展的神奇钥匙
6个Python脚本,轻松实现日常任务自动化
10个Python自动化脚本,让日常任务轻松便捷!
AppTask: 使用Python实现日常APP任务自动化
十个自动化日常任务的Python脚本

随便看看