对python中一些模块的理解

一,对有关命令行参数的一些总结:

https://blog.csdn.net/itlance_ouyang/article/details/52489674

Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块。

https://blog.csdn.net/itlance_ouyang/article/details/52489674 (Python命令行命令getopt,argparse) https://blog.csdn.net/a1964543590/article/details/69791760 (这篇有关argparse讲得比较细)https://blog.csdn.net/ei1990/article/details/76423277 (flags的对比,argparse,tf两种) https://www.jianshu.com/p/a8f0b9c9dc58 (这篇很总结,并讲解了tf.app.run的原理)
总结起来的话,tf.app.flags.DEFINE_xxx()就是添加命令行的optional argument(可选参数),而tf.app.flags.FLAGS可以从对应的命令行参数取出参数。

二,有关numpy的一些知识

1,numpy基础——ndarray对象属性(https://blog.csdn.net/scorpion_zs/article/details/52526310) 这篇讲的比较细,可以配合下面那篇一起看

里面认为比较重要的知识点:

1.‘C’:行优先;’F’:列优先

>>> np.ndarray(shape=(2,3), dtype=int, buffer=np.array([1,2,3,4,5,6,7]), offset=0, order="C") 
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.ndarray(shape=(2,3), dtype=int, buffer=np.array([1,2,3,4,5,6,7]), offset=0, order="F")
array([[1, 3, 5],
       [2, 4, 6]])
  1. 函数ones创建一个全1的数组、函数zeros创建一个全0的数组、函数empty创建一个内容随机的数组,在默认情况下,用这些函数创建的数组的类型都是float64,若需要指定数据类型,只需要设置dtype参数即可。
  2. 从已知的数组中,创建shape相同的多维数组:ones_like、zeros_like、empty_like,用法如下:
>>> a = [[1,2,3], [3,4,5]]
>>> b = np.zeros_like(a)
>>> b
array([[0, 0, 0],
       [0, 0, 0]])
#其他两个函数用法类似
  1. 还有一些特殊的函数,比如生成单位矩阵,对角线全是1,其余全是0之类的,具体见网站。
  2. arange函数类似python中的range函数,通过指定初始值、终值以及步长(默认步长为1)来创建数组;linspace函数通过指定初始值、终值以及元素个数来创建一维数组; logspace函数与linspace类似,只不过它创建的是一个等比数列.
>>> np.arange(0,10,2) 
array([0, 2, 4, 6, 8])
>>> np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.linspace(0,10, 20)
array([  0.        ,   0.52631579,   1.05263158,   1.57894737,
         2.10526316,   2.63157895,   3.15789474,   3.68421053,
         4.21052632,   4.73684211,   5.26315789,   5.78947368,
         6.31578947,   6.84210526,   7.36842105,   7.89473684,
         8.42105263,   8.94736842,   9.47368421,  10.        ])
>>> np.logspace(0, 10, 10)
array([  1.00000000e+00,   1.29154967e+01,   1.66810054e+02,
         2.15443469e+03,   2.78255940e+04,   3.59381366e+05,
         4.64158883e+06,   5.99484250e+07,   7.74263683e+08,
         1.00000000e+10])
  1. fromstring函数从字符串中读取数据并创建数组, fromfunction函数由第一个参数作为计算每个数组元素的函数(函数对象或者lambda表达式均可),第二个参数为数组的形状。fromfunction的例子见网站
>>> s1 = "1,2,3,4,5"
>>> np.fromstring(s1, dtype=np.int64, sep=",")
array([1, 2, 3, 4, 5])
>>> s2 = "1.01 2.23 3.53 4.76"
>>> np.fromstring(s2, dtype=np.float64, sep=" ")
array([ 1.01,  2.23,  3.53,  4.76])
  1. 各种特殊的二维矩阵,那些上三角矩阵,下三角矩阵之类的。
  2. **这里是重点!!!!!**对于数组的操作,使用之类的。下面只是一部分,具体见原网站。
>>> x = np.arange(0, 100, 5).reshape(4, 5)
>>> x
array([[ 0,  5, 10, 15, 20],
       [25, 30, 35, 40, 45],
       [50, 55, 60, 65, 70],
       [75, 80, 85, 90, 95]])
>>> x[1,2]      #第1行,第2列
35
>>> x[1:4, 3]    #第1行到第3行中所有第3列的元素
array([40, 65, 90])
>>> x[:, 4]      #所有行中的所有第4列的元素
array([20, 45, 70, 95])
>>> x[0:3, :]    #第0行到第三行中所有列的元素
array([[ 0,  5, 10, 15, 20],
       [25, 30, 35, 40, 45],
       [50, 55, 60, 65, 70]])

2,如何了解数组的维数等信息:https://blog.csdn.net/sunny2038/article/details/9002531 这篇讲的比较细

  • ndarray.ndim:数组的维数(即数组轴的个数),等于秩。最常见的为二维数组(矩阵)。

  • ndarray.shape:数组的维度。为一个表示数组在每个维度上大小的整数元组。例如二维数组中,表示数组的“行数”和“列数”。ndarray.shape返回一个元组,这个元组的长度就是维度的数目,即ndim属性。

  • ndarray.size:数组元素的总个数,等于shape属性中元组元素的乘积。

  • ndarray.dtype:表示数组中元素类型的对象,可使用标准的Python类型创建或指定dtype。另外也可使用前一篇文章中介绍的NumPy提供的数据类型。

example:

>>> b
array([[1, 2, 3],
       [4, 5, 6]])
>>> b[:,0] # 获取第一列
array([1, 4])
>>> np.array([1,2,3,4])
array([1, 2, 3, 4])
>>> a = np.array([1,2,3,4])
>>> a.dtype # 表示数组中元素类型的对象,可使用标准的Python类型创建或指定dtype。
dtype('int64')
>>> a.ndim #返回的是数组的维度,目前是一维数组。数组的维数(即数组轴的个数),等于秩。
1
>>> a.shape# 返回的是数组的维度。为一个表示数组在每个维度上大小的整数元组。例如二维数组中,表示数组的“行数”和“列数”。ndarray.shape返回一个元组,这个元组的长度就是维度的数目,即ndim属性。
(4,)
>>> a.reshape(1,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot reshape array of size 4 into shape (1,2)
>>> b = a.reshape(2,2)
>>> b 
array([[1, 2],
       [3, 4]])
>>> b.ndim
2
>>> b.shape
(2, 2)
a = np.array([1,2,3,4,5,6])
>>> b=a.reshape(2,3)# 把b变成3行2列的二维数组!!!!!!!!!如何判断数组是几维,看(2,3)这个元组的长度就行
>>> b
array([[1, 2, 3],
       [4, 5, 6]])
>>> b.ndim
2
>>> b.shape
(2, 3)
>>> b.reshape(6)
array([1, 2, 3, 4, 5, 6]) # 这条很重要!!!!!!!!
>>> c=a.reshape(3,2)
>>> c.ndim
2
>>> c.shape
(3, 2)

2.1 有关reshape方法的一个知识点:Numpy中reshape函数参数-1的含义(https://blog.csdn.net/weixin_39449570/article/details/78619196)

我们不知道z的shape属性是多少,但是想让z变成只有一列,行数不知道多少,通过z.reshape(-1,1),Numpy自动计算出有16行,新的数组shape属性为(16, 1),与原来的(4, 4)配套。reshape官方文档介绍: One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.

2.2 arange(),reshape()用法:https://blog.csdn.net/chinacmt/article/details/78548420

具体内容见这篇就行,直接上代码一目了然

3,有关np.load,np.save,以及相关的.npy,.npz文件:https://blog.csdn.net/m0_37041325/article/details/78006203 https://blog.csdn.net/sherrylml/article/details/51494052 (这两篇大同小异)

  • np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。
  • 如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容。

4,有关array,ndarray的区别

https://stackoverflow.com/questions/15879315/what-is-the-difference-between-ndarray-and-array-in-numpy
np.array只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类。你也能够用np.ndarray来创建数组,但这不推荐。Arrays 应该能用array,zeros 或empty来构造…

三,有关类,对象(objective),实例(instance)的理解

class是模子,instance是用模子刻出来的东西
class是共性,instance是基于class的共性实现出来的具体的某个东西(对象)
instance是从class生出来的

最常见的举例是:

类Class:鸟

类的方法(函数):(鸟)会飞

类的属性(变量):爪子,翅膀

实例

对象:麻雀,是(类Class)鸟 的一种

对象方法(函数):麻雀会飞

对象的变量:麻雀有2个爪子,一对翅膀

四,有关__init__,self的理解

https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/ (这篇讲得非常好!!!!!
https://www.cnblogs.com/fengyiru6369/p/8287426.html (这篇直接上代码讲述init方法,一目了然

五,python中数组和列表读取一列的方法(https://blog.csdn.net/songyunli1111/article/details/78109976/)

>>> a=[[1,2,3],[4,5,6]]
>>> a[0]    #取一行
[1, 2, 3]
>>> a[:,0]  #尝试用数组的方法读取一列失败
TypeError: list indices must be integers or slices, not tuple
>>> b=[x[0] for x in a]
>>> print(b)
[1, 4]

对于数组,则上面的第二个模块有关ndarray讲解有提到。

>>> import numpy as np
>>> a=np.array([[1,2,3],[4,5,6]])
>>> a[:,0]
array([1, 4])

六,python 循环结构(for-in) (https://www.cnblogs.com/kiki5881/p/8541887.html)

把觉得很重要的罗列出来,其余的去网址看:
遍历字典

d = {'a':'apple', 'b':'banana', 'c':'car', 'd': 'desk'}
​
for key in d:
    # 遍历字典时遍历的是键
    print(key, d.get(key))
​ 
输出:
a apple
b banana
c car
d desk

# for key, value in d.items():
# 上下两种方式等价 d.items() <=> dict.items(d) # 这里很重要!!!!!!!!!!!!!
for key, value in dict.items(d): 
    print(key, value)
输出跟上面一样, 最好记下面的,经常看到!!!!!!!!!!!!!!!!!

七,generator的理解 http://www.cnblogs.com/xybaby/p/6322376.html

八, 继承,super函数理解

https://www.cnblogs.com/xinghuaikang/p/8481712.html

继承的功能:父类的代码重用

多态的功能:同一方法对不同类型的对象会有相应的结果

开闭原则:对扩展开放,对修改封闭

super类功能:新式类实现广度优先的不重复的调用父类,解决了钻石继承(多继承)的难题

(要理解mro中的C3算法):https://blog.csdn.net/mystyle_/article/details/77619416?utm_source=blogxgwz1

https://blog.csdn.net/u011467553/article/details/81437780

个人理解:

1.调用了父类的方法,出入的是子类的实例对象

2.新式类子类(A,B),A就在B之前

3.super类似于嵌套的一种设计,当代码执行到super实例化后,先去找同级父类,若没有其余父类,再执行自身父类,再往下走,

简洁点的三个原则就是:

子类在父类前,所有类不重复调用,从左到右

九,容器,可迭代对象,迭代器,生成器

  • 1,容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。
  • 2,可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
  • 3,迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next__和__iter__方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
  • 4,生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield。

十 python中@classmethod @staticmethod区别

https://www.cnblogs.com/elie/p/5876210.html

Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式.

class A(object):
    def foo(self, x):
        print("executing foo(%s,%s)" % (self, x))
        print('self:', self)
    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s,%s)" % (cls, x))
        print('cls:', cls)
    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)    
a = A()

普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。 @classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。

self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。

问题:@staticmethod修饰的方法函数与普通的类外函数,为什么不直接使用普通函数?

@staticmethod是把函数嵌入到类中的一种方式,函数就属于类,同时表明函数不需要访问这个类。通过子类的继承覆盖,能更好的组织代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: think模块Python编程语言的一个常用模块,它包含了一些实用的函数和方法,可以帮助我们进行数学计算、字符串处理和文件操作等任务。 首先,think模块提供了一些数学函数,如math函数,我们可以使用它们进行数值计算。例如,可以使用math.sqrt(x)来计算一个数的平方根。 其次,think模块还提供了一些字符串处理函数,如split和join函数。split函数可以将一个字符串按照指定的分隔符拆分成多个子字符串,而join函数可以将多个字符串连接起来。这在处理文本和数据时非常有用。 此外,think模块还包含了一些文件操作的函数,如open函数。我们可以使用open函数来打开一个文件,并进行读取、写入和关闭等操作。这使得我们可以方便地进行文件的读写操作。 另外,think模块还提供了一些其他实用的函数和方法,如随机数生成函数random和时间相关函数,我们可以使用它们来生成随机数或获取当前时间等。 总之,think模块Python编程一个非常实用的模块,它提供了许多函数和方法,可以帮助我们进行数学计算、字符串处理和文件操作等任务。熟练掌握think模块的使用,可以提高我们的编程效率,并使我们的代码更加简洁和易读。 ### 回答2: think模块Python一个开源的轻量级数学库,主要提供了一些数学函数和常量的功能。它包含了一些常见的数学运算函数,如求平方根、求指数、求对数、取整等。此外,它还提供了一些常用的数学常量,如π(π=3.14159...)、e(e≈2.71828...)等。 使用think模块时,首先需要导入该模块。导入模块的语句通常为: ``` import think ``` 接下来,我们便可以通过模块名加点的方式使用其的函数和常量。例如,求平方根可以使用think.sqrt()函数,求指数可以使用think.exp()函数,求对数可以使用think.log()函数。使用示例如下: ``` import think x = 16 x_sqrt = think.sqrt(x) print(x_sqrt) # 输出:4.0 y = 2.71828 y_exp = think.exp(y) print(y_exp) # 输出:15.154262241479262 z = 1000 z_log = think.log(z, 10) print(z_log) # 输出:3.0 ``` 除了上述函数,think模块还提供了一些其他常用的数学函数和常量,如三角函数、阶乘函数、圆周率π等。通过查看think模块的官方文档可以了解到更多函数和常量的使用方法。 总之,think模块提供了一些常见的数学函数和常量,方便我们在Python程序进行数学计算和处理。它的使用简单明了,只需要导入模块并调用相应的函数即可。 ### 回答3: 在Python,"think"模块是指"Think Python"这本书的附属模块,它包含了与书相关的代码和练习。这个模块主要用于教授编程初学者Python的基础知识。 使用"think"模块,首先需要在Python安装该模块。安装好后,我们可以通过导入"think"模块来使用其的功能和方法。 "think"模块提供了一些有用的函数和类,包括: 1.函数: - `factorial(n)`: 返回n的阶乘。 - `fibonacci(n)`: 返回一个包含前n个斐波那契数列的列表。 - `is_palindrome(word)`: 检查一个字符串是否为回文,如果是则返回True,否则返回False。 2.类: - `Point`: 表示二维平面上的一个点,提供了计算两个点之间距离的方法。 - `Rectangle`: 表示一个矩形,提供了计算矩形面积和周长的方法。 使用"think"模块,可以通过调用其的函数和类来完成各种任务。例如,我们可以计算一个数字的阶乘、生成斐波那契数列、检查一个字符串是否为回文等。 除了函数和类,"think"模块还包括了一些实例和案例,用于帮助读者更好地理解和应用书的概念。这些实例和案例可以通过阅读模块的文档和使用示例代码来学习和练习。 总而言之,"think"模块是"Think Python"这本书的一个辅助工具,用于提供代码、功能和示例,帮助初学者更好地学习和理解Python编程。通过使用该模块,读者可以更加轻松地掌握和应用书的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值