python基本语法的有关知识

修改:关于本文中数据结构和数据类型的理解,以数据结构和算法中的内容为准。

从五个方面理解python语法

一、数据类型和数据结构

1)数据类型:字符串、数字
2)数据结构:列表、字典、元组、集合

二、逻辑控制

1)判断
2)循环

三、函数

四、类

五、文件操作

重点理解

三、函数

1.函数:看成一个黑箱子,输入一个东西,输出一个东西。

2.内置函数:是安装python解释器时,自带的一些库函数。编写代码时,可以随意调用这些内置函数。这里的黑箱子不用我们去实现,已经被实现好了,封装在库函数中。

3.自定义的函数:就是自己写代码定义一个函数,功能也是看成输入一个东西,输出一个东西。只不过这里的黑箱子需要自己编写代码来实现。主要掌握函数如何定义,函数怎么实现,函数如何调用。

四、类

1.类的定义

类是具有一系列相同特征的事物,比如人是一类,猫是一类,杯子又各是一类。

2.类的属性

也叫类的变量,就是在类里面定义的变量,和普通变量没什么区别。

3.类的实例化

现在有个变量叫小明,我们把它赋值为人这个类,那么他就是人了,他具有人的所有特征。小明也就是实例,这个过程叫类的实例化。所以,类的实例化,就是变量赋值的过程,只不过等式右边这个值,是一个类,而不是普通的字符串,数字,或是列表。
(当然,可以不进行类的实例化,直接相当于将该类名默认作为一个实例,也能够进行类的全部功能调用。但是这时,修改类中的变量相当于类的定义被改变了;而类的实例化后,再进行类的属性修改,只是该实例下的类属性被改变了)

4.类属性引用

就是实例使用类中的属性,具体引用方法就是在实例后加个点,再跟上属性。就如“小明.吃饭”,实例(小明)使用了类中的属性(吃饭)。上面提到的类实例化后的属性修改,就是在这种情况下的修改。

5.实例属性

为某个“类的实例”创建了一个独有的属性,而这个属性是其他实例所没有的,因为原始类没有定义它。这是在类的实例化后再新增的属性定义,比如“小明.世界飞人”,显然不可能人人都是世界飞人,那么这个属性就是小明这个实例独有的。
具有怎么定义实例属性呢,只要在实例后加个.,再加上新增属性名,并为这个实例属性赋个值就行了。后面便可以使用这个实例属性。
要注意“实例属性”和“类的属性“”的区别,实例直接引用类的属性,不需要再定义,而实例使用实例属性需要先定义,再使用。再者,类的属性是所有实例共享的,而实例属性是谁定义,谁才能使用。

注意:引用属性时,先引用实例属性,如果没有,再去找类的属性(在类中,方法外定义的属性为类属性,存储在类空间中,独一份,可共享,在实例方法中以self方式定义的属性为实例属性,存储在实例空间中,每个实例拥有自己的实例属性,不共享。实例属性只能通过实例来调用,类属性可以通过类调用,也可以通过实例来调用,那么我们要知道,在使用属性时,查找的顺序是就近原则,先从对象存储空间查找,找到则停止继续查找,没有就进去类空间查找,找到则停止查找,没找到则报异常。如果存在实例属性与类属性同名时,通过实例调用该属性名,则调用的是实例属性。)
在这里插入图片描述

6.实例方法

函数不在类中定义,叫函数;函数在类中定义,就叫方法。反正方法就是函数,属性就是变量,只不过在类中的叫法变了而已。
类中定义的函数(方法),变量(类的属性)都是为了真正的实例而用的,类中定义函数时,会在括号中加入参数self,表示实例本身,这样写的目的是,在类的实例化时,实例会被编译器默默传入方法后面的括号,那么该实例就能使用这个方法了,显然,实例使用方法不能像使用类的属性那样,直接使用,需要在类的实例化时,在方法后面的括号传入实例名字。
方法后面的括号第一个参数self(实例名字)不用传入,但像普通函数一样,会有形参,所以在实例使用方法时,需要在括号中放入对应的实参,第一个实例名字就不用再传入了,这是编译器自动传入的,不需要我们手动传入。
为什么要有self?
在这里插入图片描述
参考网址:点击这里

7.特别的实例方法

init(),这个本质也是函数。一般类中定义的方法,我们要想使用方法,必须要这样做“实例.方法(传入实参)”,但是__init__()这个方法,我们在实例使用此方法时,不要再像一般实例方法引用那样做,可以直接使用__init__()中的功能,init()第一个参数也是self,这一点遵循一般方法的定义,后面的参数,传入时,直接在类的实例化时,在类后面的括号中
传入。一般方法中的参数,是在实例使用此方法时,在方法后面的括号传入。
init()里面可以新增类的属性,这里面的属性其实是实例属性了,是由在类的实例化后才能生效,不同的实例,传入的参数
不同,那么对应__init__里面的功能显然不同。
注意其比较于实例属性,实例属性是类的实例化后再增加的,而__init__()在实例化时产生的。

8.类的继承

重新定义一个类2,在类2名后的括号中,放入一个已经定义好的类1,说明类2继承了类1的所有属性和方法,当然可以对想要不相同的地方进 行修改,从而继承想要的特性,类1叫父类,类2叫子类。
类的继承从本质上说,是利用一个定义好的类,去定义一个新的类。后续便可再进行类的实例化。

9.内置类属性

不需要经过类的实例化,就能用的属性,比如__name__
参考地址:点击这里

问题

python代码执行的全过程?
主要弄清python解释器如python3.7,python编辑器如pycharm,C语言的编译器visual c++,它们之间的关系?
以及python终端执行代码和在编辑器pycharm中执行代码的区别?
python程序的入口是什么?
编译型语言的程序入口地址是什么?
硬件描述语言的程序有入口地址吗?

1.面向过程和面向对象语言的区别?

答:
面向过程,程序的一步步过程,逐步实现,性能高,不易维护
面向对象,将程序分为几大块,分模块实现再组合,性能低,易维护
参考网址:点击这里

2.编译型语言和解释型语言的区别?

答:
参考网址:点击这里

1)编译型语言

工作过程:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)

在这个工作流程中,编译器调用预处理器进行相关处理,将源代码进行优化转换(包括清除注释、宏定义、包含文件和条件编译),然后,通过将经过预处理的源代码编译成目标代码(二进制机器语言),再通过调用链接器外加库文件(例如操作系统提供的API),从而形成可执行程序,让机器能够执行。
在这里插入图片描述
特点:不适合跨平台执行(跨平台的概念可以理解为不同CPU架构(例如X86、ARM等)的机器,还有同种CPU但不同的操作系统(例如Unix、Windows等)的机器)
执行效率高

2)解释型语言

工作过程:
在程序执行时,解释器读取一句源代码之后,先进行词法分析和语法分析,再将源代码转换为解释器能够执行的中间代码(字节码),最后,由解释器将中间代码解释为可执行的机器指令。

改进的方法:可以先将源代码完整的进行转换,编译成更有效率的字节码,保存成后缀为“.pyc”的字节码文件,然后,通过对比源码是否发生变化,有,生成新的字节码文件;翻译器再通过这个文件一句一句的翻译为机器语言去执行
在这里插入图片描述
为了对源码重复量大的代码块,提高执行效率,引入JIT即时编译器,解释器和编译器共同作用。
在这里插入图片描述

特点:解释型语言在不同的平台有不同的解释器,从而使得源代码可以跨平台,不做修改或做极小的源码修改。

3)区别

编译型语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。
参考网址:点击这里

3.解释器、编辑器、编译器的区别?

答:
解释器将解释型语言翻译成机器指令,编译器是将编译型语言翻译成机器指令。而编辑器只是提供单纯的代码编辑功能,美化功能等。
python3.7是解释器,pycharm是python编辑器,visual studio code是万能语言代码编辑器,visual c++是c++编译器
参考网址:点击这里

4.python程序执行的起点?C语言程序执行的起点?Verilog语言执行的起点?

答:
参考地址:[点击这里]点击这里(https://www.cnblogs.com/cnXuYang/p/8336370.html)

1)我们运行test.py时,python解释器,首先会运行test.py代码中,最先出现的“非函数定义”和“非类定义”的没有缩进的代码,如打印一条语句print(“python”)。当在这些非缩进代码中遇到了a函数调用,则此时python解释器会执行原先定义的a函数。
(Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。)

  1. test.py可能被直接执行,也可能作为模块导入到其他.py文件中,此时为了区分test.py文件是主动执行还是被调用,Python引入了变量__name__。当文件是被调用时,__name__的值为模块名,当文件主动执行时,__name__为’main’。所以一般既可能作为主动执行,也可能作为被调用的文件,会在代码中添加“if name == ‘main’:”,当文件主动执行时,if语句成立,该条语句下的代码会被执行,否则当文件是被调用时,该条语句下代码不会被执行。

3)文件属性__name__的含义:内置类属性,功能是获取类名,当前test.py文件被直接执行时,name__获取的类名就是__main,否则__name__的值就是test

4)C、C++中main()是程序的入口

5)Verilog语言执行的起点是每个always模块或者process模块,同时执行,生成电路。

总结

1.python的简单数据类型有哪些?

答:
字符串,数字(整数,浮点数)

2.变量是什么?

答:
1)变量是用来存放各种数据类型的容器,容器本身大小不同,物理存储结构也不同。
定义一个变量,本质是向内存申请一段存储空间。可以是存放一个数据的独立存储空间(第一种存储结构),如存放一个整型数据,一个浮点型数据,一个字符型数据,一个布尔型数据,以及一个字符串型数据。对于不同的数据类型,申请的存储空间大小不同。
变量也可以申请一段连续的存储空间,即数组。(第二种存储结构)数组里的数据类型也是多样的,可以是整型,浮点型,字符型等,如果数组里的数据类型不同,那么数组的所占内存大小也不同。
以上是c++变量的理解。
对于python的变量同样,变量可以申请不同的存储结构来存储数据最简单得是一个独立存储空间,也可以是列表型存储空间,可以是字典型存储空间,可以是集合,可以是元祖。在这种数据存储结构的基础上,再关心里面到底存储什么样的数据类型,数字还是字符。因此,定义变量时,要关注两件事,一个是其数据结构(存储结构),一个是数据类型。

2)python定义变量不需要先前指定类型,但在使用之前必须进行定义,即变量在使用前附一个值就行了,即便是个空列表,如message = []
不需要像C语言那样,变量a需要先指定数据类型,如int a,python语言是解释器执行代码时自己去辨别数据类型;这个特点让编程变得简单,但代码执行效率变低。

3.数据结构和数据类型的区别?

数据结构,强调数据之间的关系,代表一种数据的存储结构,如树,队列,列表,字典等。
数据类型,强调合法的操作,如对字符串,数字可以进行什么样的操作。

4.test.py文件作为模块被导入到其他文件时,它的变量,函数,类都可以被调用。

5.if name == 'main’的作用?

答:
如果test.py代码中不加入语句“if name == ‘main’ ”,那么当test.py文件作为模块被导入时,其文件内的代码会被全部执行,由于test.py代码本身可能会有输出,那么这些不必要的输出就会产生在当前文件中,因此需要在test.py中加入语句“if name == ‘main’ ”,从而只使用test.py中的功能定义,不需要输出,确定谁才是真正的程序入口。

6.命令行解析模块:argparse模块

答:
参考网址:
参考1
参考2

功能:
在终端输入命令参数,就可以向程序中传入该参数并让程序运行。该参数不一定是真正意义上的参数,也可以是参数文件的路径,从而让程序根据该路径,来获取文件内的参数。

使用:
1)在当前运行文件中导入argparse模块(这是python内置模块)

2)创建一个解析对象:parser = argparse.ArgumentParser(description=‘Process some integers.’)
功能包含将命令行解析成 Python 数据类型所需的全部信息

3)向解析对象中添加需要关注的命令行参数,以便识别:
parser.add_argument(‘–datacfg’, type=str, default=‘cfg/ape.data’)
两种命令行参数识别的方式:位置参数
可选参数(常用),如’–datacfg’
type是要传入的参数的数据类型 help是该参数的提示信息 ,default是当终端输入命令缺少时,自动解析的默认值

4)解析解析器中的命令行参数,以便使用:args= parser.parse_args()
将参数字符串转换为对象,并将其设为命名空间的属性。 返回带有成员的命名空间。从而可以这样使用datacfg = args.datacfg

7.import、from…import…、import…as…、from…import四个语句的区别

答:
参考:
参考1

1)相同作用:导入模块,使得当前python文件可以使用定义在其他模块里的功能
2)区别:

	import导入模块后,引用模块里的功能时,需要加模块名来调用模块里的功能。如import math后,math.ceil()才是正确用法。
   
    from...import...导入模块后,引用模块里的功能时,不需要加模块名即可调用模块里的功能。
    如from cfg import parse_cfg后,直接使用parse_cfg()即可,不需要使用cfg.parse_cfg()来调用模块功能
   
    from...import * 的意思是导入了这个模块的所有功能,我们也可以只导入指定的部分到当前命名空间中,从而减少内存开销。
    import...as... 的意思是导入一个模块的同时,为该模块取一个简化的别名,从而简化代码。
    如import numpy as np后,np.reshape()代替了numpy.reshape()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值