精华内容
下载资源
问答
  • 这个数值是以它们被打印出来的顺序存放的,所以从二进制十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。 Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令...

    Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。

    Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对 一的关系,多重精度的数学函数就相对地容易写了

    如果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。 因此, 经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用Little- Endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。这就意味着计算机中的某些计算可以变得更加简单和快速。

    转载于:https://www.cnblogs.com/cenhao/archive/2011/09/21/2184566.html

    展开全文
  • 2-10进制转换8421法(连加)或(连减)IP与子网掩码IP地址位数与个数关系:2^n次方。子网掩码:屏蔽IP地址网络部分“全1”比特模式。将某个IP地址划分成网络地址主机地址两部分。子网掩码不能单独...

    2-10进制转换

    8421法二转十(连加)或十转二(连减)

    IP与子网掩码

    IP地址位数与个数的关系:2^n次方。

    子网掩码:屏蔽IP地址的网络部分的“全1”比特模式。将某个IP地址划分成网络地址和主机地址两部分。子网掩码不能单独存在,它必须结合IP地址一起使用。

    三步划分子网

    子网划分

    • 网段:是指标准子网掩码产生的一段网络IP范围
    • 子网:借用“主机位”将网段划分更小的网络,称为子网,一般指往右“借位”VLSM(可变长子网掩码)
    • 超网:借用“网络位”将网段合成更大的网络,称为超网,一般指往左“借位”CIDR(无类别域间路由)

    子网划分步骤:三步走(段块数)

    • 看段:看子网掩码在第几段变化
    • 算块:计算块大小,就是一段范围
    • 求数:关于子网划分一些计算秒杀

    地址解析协议ARP

    地址解析协议ARP:IP查询MAC地址,询问/回答机制。ARP缓存表、ARP欺骗、ARP病毒、代理ARP、反向RARP。ARP请求是采用以太网帧方式发送的。

    代理ARP:由路由器充当第三方代理,进行ARP请求/回答。

    反向地址解析协议RARP:由MAC查找IP,常用于无盘工作站,设备没有硬盘,无法记录IP,刚启动时发送一个广播,用MAC去获取IP。需要RARP服务器,记录MAC与IP的对应关系。

    ARP欺骗和ARP病毒:假如向某一主机发送伪装ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

    内部路由协议RIP

    路由协议

    • 静态路由协议
    • 动态路由协议
      • 内部网关协议(IGP)
        • 链路状态路由算法OSPF
        • 距离矢量路由算法
          • RIP
          • RIP2
          • IGRP,思科专有
        • 混合型路由算法:EIGP,思科专用,少用。
      • 外部网关协议(EGP)
        • EIG
        • BGP

    路由信息协议RIP:距离矢量算法,计算跳数,最大15跳。30s周期更新、180s超时不存在、240s删除路由(助记:168)。支持等费用负载均衡和链路冗余。使用UDP的520端口,IP层上协议号为17。应用层协议

    1bc9d631657c6c295bea3618e41be358.png

    RIPv1与RIPv2

    防止环路的办法

    • 最大跳数:当一条路由条码发送出去会自加1跳,跳数最大为16跳,意味着不可达。
    • 水平分割:一条路由信息不会发送给信息的来源。
    • 反向毒化的水平分割:把从邻居学习到的路由信息设为16跳,再发送给那个邻居,更安全。
    • 抑制定时器和触发更新也可以防止环路。

    内部路由协议OSPF

    开放最短路径优先协议OSPF:链路状态算法,包括:连通、距离、时延、带宽等状态,Dijkstra的SPF算法。触发更新、分层路由。支持大型网络。网络层的协议,协议号89。

    OSPF区域类型

    • 主干区域(32位),Area 0.0.0.0或者Area 0来表示,连接其他区域,都要经过主干区域,也接收任何路由信息。
    • 标准区域:接收任何路由信息
    • 完全存根区域:只接收区域内的路由信息,其他一概不接收。思科专有的。
    • 不完全存个区域:除接收本区域的路由信息,还接收类型7的(特殊信息)。

    OSPF根据物理连接和拓扑结构,分为以下网络类型:

    • 点到点网络(Point-to-Point):有效邻居总是可以形成邻居关系;组播地址为224.0.0.5,该地址称为AllSPFRoutes。
    • 点到多点网络(Ponit-to-Multicast):不选举DR/BDR,可看作是多个Point-to-Point链路的集合;单播(Unicast)。
    • 广播型网络(Broadcast):选举DR/BDR,使用路由器和BR/DBR交换信息,DR/BDR不能被抢占,广播型网络有:以太网、Token Ring和FDDI;DR、BDR组播到224.0.0.5,DR/BDR侦听225.0.0.6,该地址称为AllSPFRouters。
    • 非广播型(BNMA):没有广播,需手动指定邻居,Hello消息单播,NBMA网络有X.25、Frame Relay和ATM;单播。
    • 虚链接(Virtual Link):虚链路一旦建立,就不再发送Hello消息,应用:通过一个非Area 0连接Area 0的两个分段骨干区域;单播。

    OSPF路由器分类:根据不同区域之间的功能分为BR、IR、ABR、ASBR。

    OSPF的五种报文类型:

    • Hello报文:用于发现相邻的路由器;默认10s或30s更新一次,40s失效,目标地址是224.0.0.5所有路由器。用于发现建立邻居、还用于选出区域内的指定路由器DR和备份指定路由器BDR(DR/BDR组播地址是224.0.0.6)
    • 数据库描述DBD:表示发送者的链路状态数据库内容
    • 链路状态请求LSR:向对方请求链路状态信息
    • 链路状态更新LSU:向邻居路由器发送链路状态通告
    • 链路状态应答LSAck:对链路状态更新报文的应答

    内部路由协议BGP

    边界网关协议BGP:是外部网关协议,不同自治系统AS之间,寻找较好的路由策略。通过TCP的179端口建立连接,网络层协议号6。支持子网VLSM和CIDR,是一种路径矢量协议。目前最新BGP4,而BGP4+支持IPv6。

    BGP的四种报文:Open建立邻居,Keepalive周期性探测邻居存活。每一个自治系统要选择至少一个路由器作为该自治系统的“BGP发言人”。增量更新,支持认证。可靠传输,防止环路。自治通信,策略支持。支持无类、支持聚合。

    • 打开(Open):建立邻居关系
    • 更新(Update):发送新的路由信息
    • 保持活动状态(Keepalive):对Open的应答/周期性地确认邻居关系
    • 通过(Notification):报告检测到的错误。

    以上是为准备网络工程师考试的学习大涛老师18年视频的笔记,在此记录以备复习。

    #网络工程师# #软考中级职称# #ip# #交换机# #内网#

    展开全文
  • 同时, 针对现有基于二进制和十进制编码 小世界优化算法运行时间长等缺点, 提出一种新型基于实数编码小世界优化算法, 函数测试和应用于非线性预 测控制滚动优化反映了其较强能力. 最后, 将其...
  • 计算机中位运算

    2014-10-28 11:18:00
    位运算是C/C++中基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生运算——大多数程序员...(2)进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用,用于将十进制按照...

    位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算。本篇先简要介绍基本的位运算操作符及其用法(何时使用),然后介绍位运算符的几个典型应用:

    (1)      三种不用临时变量交换两个整数的实例,并分析每个实例的优缺点

    (2)      进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用的,用于将十进制按照2的n次方进制输出的程序。

    (3)      给出利用位运算实现的计算整数的二进制表示中有多少个1的实例。

    揭开位运算的面纱

    所 有数据在计算机底层都是按二进制存储的,一个数据可以看做是一个有序的位集合。每一位只有两种状态:0或1。位运算允许程序员操作数据的某一特定位,比如 将某位设置为1(或0),查询某位的状态(1,或0)。位运算由位运算操作符和操作数组成,不同的位运算操作符定义了不同的位运算,下面的表格是对每种位 运算操作符及其对应的位运算和功能进行描述:

    位运算操作符

    对应的位运算

    用法

    功能描述

    ~

    按位非

    ~expr

    翻转expr的每一个位:1变0,0变1

    << 

    左移

    expr<<n

    将expr向左移动n位,移到外面的被丢弃,右边的位补0,因此左移n位相当于乘以2n

    >> 

    右移

    expr>>n

    将expr向右移n位,移到外面的被丢弃,如果expr是无符号类型,则左边补0,否则,左边插入符号位的拷贝或者0(视具体实现而定)。

    &

    按位与

    expr1&expr2

    在每个位所在处,如果expr1和expr2都含有1,那么结果该位为1,否则为0。

    |

    按位或

    Expr1 | expr2

    在每个位所在处,如果expr1和expr2都含有0,那么结果该位为0,否则为1。

    ^

    按位异或

    Expr1 ^ expr2

    在每个位所在处,如果expr1和expr2不相同,那么结果该位为1,否则为0.

    除了上面的基本位运算操作符外,还有&=,^=,|=,<<=,>>=等组合符号,它们分别是:按位与赋值,按位异或赋值,按位或赋值,左移赋值,右移赋值。接下来介绍如何实现位操作:

    1.将expr的第n(n从0开始)位设置为1:        expr |= (1<<n);

    2.将expr的第n(n从0开始)位设置为0:    expr &= (~(1<<n));

    3.判断expr的第n(n从0开始)位是否为1:bool b =expr & (1<<n);

    4.翻转expr的第n(n从0开始)位:expr ^=(1<<n);

    注意

    1.      C标准提供了bitset来进行各种位操作,可以在MSDN中输入bitset了解相关内容,使用时需要包含头文件:#include”bitset”。

    2.      位 运算只能用于操作有整数类型的数,比如说char,short,int,long等(包含signed 和unsigned),不能操作浮点数,比如float,double!std::bitset的构造函数的参数是unsigned long int,尽量不要对负数进行为操作,因为可移植性差,不同的系统平台对负数的右移操作定义不一样(大多数平台规定高位补符号位,有些平台规定高位补0)。

    位运算应用实例1:不用任何中间变量,交换两个整数

    这个问题是比较经典的了,你可以很容易地在网上找到多种答案,我在这里给出两个方案:

    方案1:用算术运算实现(一个不完美的方案)

    该方案的思路简单,实现代码很短,如下:

    1. Template<class T>  
    2. Void mySwap_1(T& a, T& b)  
    3. {  
    4.          a = a+b;  
    5.          b = a -b;  
    6.          a = a-b;  
    7. }  

     

    简单吧,但是我还要简单说一下:第一句a=a+b;是用a保存原来的a跟原的b的和;第二句b = a-b;使得原来的a的值被保存到了b里面;最后一句a=a-b;使得原来的b的值保存到了a里面。

    我 们说这个方法是不那么完美的,原因在于算术运算可能会出现结果溢出的问题,假如a,b都非常大,那么第一句a=a+b就会导致结果溢出,比如说原来的a = 2147483647,b = 2,那么a+b就为2147483649,这个数大于了最大的无符号整数2147483648,因此发生溢出,a中保存的结果实际上 是:-2147483647,但是让人惊讶的是:虽然第一句程序得到的结果为-2147483647,后面两句得到的结果却是正确的,即能实现交换原始a,b的值,也就是说:只有第一句的结果是错误的,但最后的结果却是正确的,这一点让我很迷惑,至今还没弄清楚缘由,再次向各位求教!

    最后,谈谈这种方法相对于后面的方案2的优点:该方法可以用于交换两个非整数(浮点数),而方案2基于位运算,而对浮点数不能直接使用位运算,因此方案2不能用于交换两个浮点数!

    方案2:用位运算实现(较好的方案)

             该方案代码与方案1及其相似,思路也不难,先看代码,然后再看我啰嗦的剖析:

    1. template<class T>  
    2. void mySwap_2(T& a,T& b)  
    3. {  
    4.     a = a^b;  
    5.     b = b^a;  
    6.     a = a^b;  
    7. }  

     

    对 于编程老手来说,这个交换函数并不陌生,但我相信这些编程老手之中有一部分人只记得这么写代码,而不知道三句代码为何这么写,事实上我最初也是这样,因此 一开始我就觉得短短3行代码,让我花费时间去理解分析,还不如直接记忆来得划算。事实上,直到今天我写这篇文章时,我舍得消耗一点脑细胞来理解它,下面我 尝试着对上述三句代码进行阐述,为了方便,假设数据类型为char,并且a = 5,b=3;那么在内存中a,b存储如下:

    a:

    0

    0

    0

    0

    0

    1

    0

    1

     

    b:

    0

    0

    0

    0

    0

    0

    1

    1

     

    接下来详细分析每一句:

    首先来看第一句:a=a^b;执行该语句后a中保存了a与b的差异位,也就是说如果原来的a和b的某一位不同,那么就将a的该位置为1,因此a在内存中成了如下图的样子,它说明a与b的第2,3个bit有差异:

    a:

    0

    0

    0

    0

    0

    1

    1

    0

     

    接着我们来看第二句:b=b^a;其意思是,将b中有差异的位翻转,如此一来b中保存的值其实就等于原来a中的值,记住当第二个语句执行完之后a仍然保存了原来的a,b的差异信息,而b则变成了原来的a!

    最 后我们来看第三句:a=a^b;由于异或运算满足交换律,因此这一句等价于:a=b^a;记住这个语句赋值号右边的b中已经保存了原始的a值,而a中保存 了原始的a,b的差异,因此这一句的最终作用是将原始a中有差异的位翻转(变成b)然后赋值给a,如此一来a中就保存了原始的b值。

    总结:上述三句中:第一句是记录差异,第2,3句是翻转,最终实现了不用任何中间变量就交换两个变量的值。

    分析:位运算不考虑进位问题,因此不会有结果溢出的问题!但是由于不能对浮点数进行直接位运算,因此该方法不能实现交换两个浮点数!当然原题题目是交换两个整数。

    备注:还有其他实现两个数交换的方法,比如采用内存拷贝!由于不属于位运算范畴,这里就不赘述了。

     

    位运算应用实例2:进制转换

    要求:分别实现十进制整数按二进制、十六进制输出。

    两种方法实现按二进制输出:

    方法1:由于整数在计算机中是按二进制存储的,我们只需要将其每个bit按顺序打印出来即可,如果某位为1,则打印字符‘1’,否则打印字符‘0’。我给出的代码如下:

    1. voidprintBinary(int num)  
    2. {    
    3.     for(int i=0;i<32;i++)  
    4.     {  
    5.        cout<<((num>>(31-i))&1);  
    6.         //cout<<( (num &(1<<(31-i))) ==0? 0 : 1 );  
    7.     }  
    8. }  

     

    其 中被注释掉的那个cout与没注释的cout有同样的功能!这个函数的思路很简单,就是从高到底逐位打印每个bit。我上面的代码有一点不好的地方,那就 是语句太复杂,一个cout语句干了太多的事情,如果影响您的理解,那么你可以增加几个临时变量,然后把它拆分成多个简单语句。我这么写主要是考虑到篇幅 的原因,因此程序段太占篇幅了。随便说一句,编程时,语句力求简单明了:一行只写一条语句,一条语句只干一件事情!

    方法二:利用bitset来实现

    bitset是标准库提供的一个类(不是容器),利用它就可以很方便地操作位,下面是用bitset来实现的程序:

    1. voidprintBinary(int num)  
    2. {   
    3.    bitset<32> bits =bitset<32>((unsigned long)(num));  
    4.     for(int i=31;i>=0;i--)  
    5.     {  
    6.         cout<<(bits[i]==true? '1' : '0');  
    7.     }     
    8. }  

     

    备注:关于bitset重载了多个运算符,其中包含下标运算符:[],可以方便地取得某一个bit,看它是否为1。关于bitset的更多信息请查阅msdn或者其他资料,你只要记住bitset是标准库提供的,你可以随时使用,不要忘记添加相应的头文件。

    实现按16进制输出:

    同样由于数据在内存中是按二进制存储的,因此将整数按照16进制输出我们可以如下做:从左向右,每4位bit一组,组合成一个十六进制数,一次输出即可,其程序如下:

    1. void printHex(int num)  
    2. {  
    3.     for(inti=28;i>=0;i-=4)  
    4.     {  
    5.         int temp =num>>i;  
    6.         temp =temp&15;  //15是掩码!  
    7.         char ch;  
    8.        temp>9?(ch ='A'+temp-10):(ch = '0'+temp);  
    9.        cout<<ch;  
    10.     }     
    11. }     

     

    该 程序与上面的printBinary函数非常相似,要注意的是i每次变化4,最关键点在于语句temp= temp&15;由于是16进制,因此这里用15做掩码。我想有了printBinary做铺垫,理解这个printHex并不难,这里不赘述 了。接下来我将对这两个函数进行个小小的扩展:实现整数按2n (2的n次方)进制输出!比如按8进制,32进制等。为了方便描述,我们限制1<=n<=6;并用字符’0’到’9’表示数字0到9,用字符A,B,……Z,a,b,……表示数字10到63。程序如下:

    1. void print2powerN(int num,int N)  
    2. {  
    3.     for(inti=32-N;i>=0;i-=N)  
    4.     {  
    5.         int temp =num>>i;  
    6.         temp =temp&((1<<N)-1);  
    7.         char ch;  
    8.        if(temp<=9)  
    9.         {  
    10.             ch ='0'+temp;  
    11.         }  
    12.         elseif(temp<=35)  
    13.         {  
    14.             ch ='A'+temp-10;  
    15.         }  
    16.         else  
    17.         {  
    18.             ch = 'a'+temp - 36;  
    19.         }             
    20.        cout<<ch;  
    21.     }  
    22. }  

     

    备注:用位运算也能实现十进制到任意进制的转换,这个问题比较难,我暂时还没弄透彻!

     

    位运算案例3:求整数的二进制表示中1的个数

    问题描述:输入一个整数N要求输出其二进制表示中1的个数M,比如N=13,则M=3;

    分析:该问题的求解方法不止一种,可以对二进制表示的每一位逐位扫描来实现,这种方法的复杂度是o(n)其中n是N的二进制表示的总位数。这里介绍如何用位操作来求解,并且保证其复杂度低于o(n),事实上该方法的复杂度为o(m),其中m是N的二进制标识中1的个数!

    思路:在讲述具体实现时,来看这样一个事实:n&(n-1)能实现将最低位的1翻转!比如说n=108,其二进制表示为01101100,则n&(n-1)的结果是01101000。因此只要不停地翻转n的二进制的最低位的1,每翻转一次让计数器+1,直到n等于0时,计数器中就记录了n的二进制中1的位数,程序如下:

      1. int count1Bits(long n)  
      2. {  
      3.     int count =0;  
      4.     while(n)  
      5.     {  
      6.         count++;  
      7.        n&=(n-1);  
      8.     }  
      9.     return count;  

    转载于:https://www.cnblogs.com/20140930zn/p/4056366.html

    展开全文
  • 1.Python优缺点 简单 易学 开发效率高 面向对象 免费开源 可移植性强 可拓展性 含有丰富的第三方库 解释型语言运行比编译型语言慢 2.进制的函数 其他转换为二进制:bin() 其他转换为八进制:oct() 其他转换为...

    1.Python优缺点

    • 简单 易学
    • 开发效率高
    • 面向对象
    • 免费开源
    • 可移植性强
    • 可拓展性
    • 含有丰富的第三方库
    • 解释型语言运行比编译型语言慢

    2.进制的函数

    • 其他转换为二进制:bin()
    • 其他转换为八进制:oct()
    • 其他转换为十六进制:hex()
    • 其他转换为十进制:int(‘数字串’,进制数),若写一个参数则为转换为10进制

    3.ASCII码转换的函数

    • 字符转换为ASCII码:ord()
    • ASCII码转换为字符:chr()

    4.浅拷贝和深拷贝

    • 浅拷贝copy.copy(),粗略复制,可变类型的改变会相互影响
    • 深拷贝copy.deepcopy(),完全复制,与原数据没有关系

    5.命名规范

    • 数字、字母、下划线组成
    • 长度任意长
    • 不能含有关键字(查看Python关键字的命令keyword.kwlist)

    6.id和==的区别

    • id方法比较的是内存地址是否相同
    • ==比较的是值是否相同

    7.可变类型和不可变类型

    • 可变类型:列表,字典,集合
    • 不可变类型:数字,字符串,元组

    8.列表基础

    • 有序可重复的序列,
    • 列表内部的元素可以是不同类型,这是和数组的区别
    • 增加:
      • [元素1,元素2]
      • append,追加
      • extend或者+,来完成多个列表合并
      • insert ,插入
    • 删除:
      • del ,Python自带方法
      • remove删除,放值
      • pop,弹出
    • 改:list[索引]=新值
    • 操作:
      • +拼接,*重复
      • count数量
      • len长度
      • reverse反转
      • sort排序
      • index求索引

    9.元组基础

    • 不可修改的有序序列,但是元组内部的可变类型元素可以修改
    • 可以使用+拼接,*号重复
    • 注意:(3)不算元组,(3,)算元组

    10.字典基础

    • 无序序列,key=value形式
    • 创建空字典的方法是dict()
    • 一个字典有同名的key,按最后一个key的值算
    • 增:
      • dict()
      • setdefault方法,只可以添加,不可以覆盖
      • update,多个字典合并,覆盖
    • 删除:
      • pop(key),弹出对于key的值
      • popitem()随机弹出一个
      • clear,清空字典
      • del方法,可以删除一个字典值,也可以删除整个字典
    • 查:
      • items,通过遍历可以查出所有的key和value
      • keys,通过遍历可以查出所有的key
      • values,通过遍历可以查出所有的value

    11.集合基础

    • 无序不可重复的序列
    • 创建空集合直接使用{}或者set()
    • 字典转换为集合,会保留key而不是value
    • 添加:
      • add方法直接添加元素
      • update(),将其他的有序列表添加进去自动去重
    • 删除:
      • clear清空
      • remove删除
      • pop弹出
    • 集合的运算
      • 交集:intersection()或者&
      • 反交集:symmetric_difference()或者^
      • 并集:union()或者|
      • 差集:difference或者-

    12.字符串基础

    • 切片:str[起始:结束:步长],左闭右开
    • 倒序:str[::-1]
    • len长度
    • count(字符),计算字符在字符串中出现的次数
    • decode解码,先编码才能解码
    • encode编码
    • startwith判断是不是规定字符开始
    • endwith判断是不是规定字符结尾
    • upper将小写变大写
    • lower将大写变小写
    • find查找有没有指定的字符串,如果有返回开始索引,没有返回-1
    • index查找有没有指定字符串,有返回开始索引,没有则报错
    • join(seq)以指定字符串作为分隔符,将seq所有的元素合并为一个新字符串
    • strip去掉空格,或者指定字符
    • replace替换指定字符串
    • maketrans()创建字符映射转换表,实现多个字符替换
    • max返回字符串最大的字母
    • min返回字符串中最小的字母
    • split切割字符串,返回列表

    13.函数复习

    • 参数顺序:位置参数,元组参数,默认参数,字典参数

    • 默认参数针对的是形参,关键字参数针对的是实参

    • 默认参数不用可变类型,会发生逻辑错误,而达不到预期结果

    • 返回值return

      • 可以返回多个值
      • return后不写值,默认返回none
      • 作用是为了结束函数和返回内容
    • 命名空间

      • locals,访问局部命名空间
      • globa,访问全局命名空间
    • 作用域及其执行顺序(按顺序介绍)

      • L(Local),局部作用域
      • E(Enclosing),局部作用域找不到找内嵌作用域
      • G(Global),内嵌作用域找不到找全局作用域
      • B(Built-in),全局作用域炸不到找内建作用域

      都找不到就会报错

    • global和nonlocal关键词

      • global可以将局部变量改为全局变量,可以使函数内部改外部的值
      • nonlocal可以修改嵌套函数的变量,使内层函数可以修改外层函数的值

    14.内置的一些函数

    • abs(),求绝对值
    • min(序列,key=函数名),求最小值,当传入key时候,按函数算
    • max(序列,key=函数名),求最大值,当传入key时候,按函数算
    • sort(序列,key=函数名),默认升序,传入函数时候,按函数算,会改变原序列
    • sorted同上,但是返回的是新序列,不改变原序列,降序加reverse=True
    • map(函数名,可迭代内容),将迭代内容依次执行函数,并返回结果,返回map对象
    • filter(函数名,可迭代内容),将迭代内容依次执行函数,返回为True的原值,返回filter对象
    • zip(序列1,序列2,序列…),将序列的元素一一对应打包成元组,按最短的长度打包,返回zip对象

    15.lambda匿名函数

    • 优点:代码简洁,不增加额外变量
    • 缺点:难于理解,降低可读性,不推荐使用
    • 注意:内部不可以包含循环、return。可以包含if-else

    16.推导式

    • 列表推导式:[i for i in list]
    • 字典推导式:{v:k for k,v in a.items()}
    • 集合推导式:{i for i in set}
    • 生成器:(i for i in tuple)

    17.面向对象

    • 面向对象三大特征:封装、继承、多态

    • 封装:

      1.使用符号__双下划线
      2.作用:为了保护隐私
      3.可以使用 _类名__属性名 对封装的方法或者变量进行修改,但是不推荐使用
      
    • 继承:

      1.被继承的类叫父类/基类、超类,继承的类叫子类/派生类
      2.子类可以使用父类的方法或者变量,也可以对父类的方法或者变量进行重写
      3.当子类想重写父类的某个方法,但是又想使用父类这个方法的一些变量,可以使用super关键字
      	例如:super().__init_(name)
      4.子类查看父类的方法:__bases__
      5.父类的私有属性不能被子类继承
      6.继承分为多继承和单继承,如果父类门拥有同一个方法,按继承的第一个顺序继承
      7.多继承的本质是使用广度优先算法,我们可以使用mro方法查看继承顺序
      
    • 多态:

      1.Python是弱类型语言,不支持多态
      2.多态的意思就是同样的方法做了不同的事
      

    18.抽象类

    • Python从语法层并没有提供像java/c#那样的抽象类支持
    • 通过abc模块的ABCMeta元类和abstacmethod包装器来达到抽象类的效果
    • 抽象类需要重写

    19.常见的八个魔术方法

    1.__init__方法:在创建对象的时候自动执行,常用来初始化属性
    2.__new__方法:在声明对象的时候自动执行,在__init__方法前被调用
    3.__str__方法:打印对象的名称时候调用,使用%s也是默认调用str,使用return返回,必须返回字符串,自动   打印return的信息
    4.__repr__方法:改变对象的字符串显示,是str方法的备用方法,找不到str调用此方法,可以使用%r方法调用
    5.__del__方法:当一个对象在内存被销毁时自动调用,无返回值
    6.__call__方法:可以将对象变成函数使用,如a()
    7.__eq__方法:可以进行比较
    8.__hash__方法:一般和eq配合使用
    

    20.反射方法

    • hasattr:判断是否由此变量,返回bool
    • getattr:获取属性值或者方法
    • setattr:给类或者对象设置属性或者方法
    • delattr:删除类或对象的属性或者方法

    21.类的常用函数

    1.issubclass():判断一个类是不是其他类的子类
      格式:
       issubclass(被检测类,父类)
       issubclass(被检测类,(父类1,父类2,父类3…))
       返回布尔值,只要符合一个条件是一个的父类,就会返回true
    2.isinstance():检测一个对象是否为某个类的对象
      格式:
       isinstance(对象,类)
       isinstance(对象,(类1,类2…))
       返回布尔值,只要一个类是当前对象的类,返回True
    

    22.read、readline、readlines区别

    • read:读取整个文件,放到字符串中;文件非常大无法使用该方法
    • readline:读取整行,包括行结束符,并作为字符串返回; 比readlines慢得多
    • readlines:一次性读取整个文件;自动将文件内容分析成一个行的列表。

    23.常见的异常

    • NameError:名字错误
    • ZeroDivisionError:0错误
    • TypeError:类型错误
    • SyntaxError:语法错误
    • IndexError:索引超出序列范围
    • KeyError:请求一个不存在的字典关键字
    • IOError:输入输出错误
    • AttributeError:尝试访问未知的对象属性

    24.进程、线程和携程

    1.线程

    • 定义:

      • CPU调度的最小单位,有时候也被称为轻量级进程;
      • 标准线程由线程ID+指令指针+寄存器集合+堆栈组成;
    • 特点:

      • 没有独立资源,但是和同属于一个进程的其他线程共享同一个进程的全部资源;
      • 同一个进程中的线程执行并发执行;
      • 线程之间相互制约,因此有三种基本状态(就绪、阻塞、运行);
    • 线程锁:

      • 产生原因: 由于同一个进程中的线程共享资源和数据,因此容易资源争夺或出现脏数据,因此有了锁可以限制某一时候只有一个线程可以访问某个指定的数据;

      • 互斥锁概念: 某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

      • 互斥锁锁的好处:

        • 确保了某段关键代码只能由一个线程从头到尾完整地执行
        • 保证代码正常的情况下,尽量给最少的代码的上锁,因为上锁的代码只能以单线程执行,效率低
      • 互斥锁锁的坏处:

        • 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
        • 由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
      • 互斥锁死锁:

        • 定义:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
        • 避免死锁:添加超时时间自动释放
    • GIL锁

      • 产生原因:作为解释型语言,Python的解释器必须做到既安全又高效。数据的保护机制是是解释器全局锁GIL。GIL对当前线程状态和为垃圾回收而用的堆分配对象这样的东西的访问提供着保护。
      • **影响:**使我们我们不可随意使用多线程。
    • 线程的通信通过队列

    2.进程:

    • 程序执行的最小单位;
    • 每个进程都有自己独立的数据空间,不同进程之间通常是不能共享数据,创建一个进程需要非常大的开销。
    • 进程之间的通信也可以使用队列;
    • 一个进程中至少包含一个线程;

    3.协程

    • 线程和进程的操作是由程序触发系统接口,最后的执行者是系统,它本质上是操作系统提供的功能。而协程的操作则是程序员指定的,在python中通过yield,人为的实现并发处理。
    • 存在意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时。协程,则只使用一个线程,分解一个线程成为多个“微线程”,在一个线程中规定某个代码块的执行顺序。
    • 第三方模块: greenlet和gevent。gevent是对greenlet的高级封装,因此一般用它就行。

    4.进程线程的区别

    • 建议在IO密集型任务中使用多线程,在计算密集型任务中使用多进程。
    • 进程与进程相互独立,同一个进程中的线程共享该进程的内存空间和数据。
    • 线程启动速度快,进程启动速度慢。
    • 通信都可以通过各自模块的队列进行。
    • 同一个进程中的线程可以操其他线程,但是进程智能操作其他子进程。

    25.迭代器+生成器+可迭代对象

    可迭代对象

    1.实现了__iter__方法的对象就叫做可迭代对象
    2.__iter__方法的作用就是返回一个迭代器对象。直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。
    

    迭代器

    • 迭代器两个基本方法,iter和next
    • 可以将迭代对象通过iter方法变为迭代器对象,通过next每次输出
    • 特点是可以记住遍历对象的位置,类似队列的机制
    • 当迭代完成,继续next会报出StopIteration异常

    生成器

    • 使用了yield的函数被称为生成器,生成器就是一个迭代器
    • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行next() 方法时从当前位置继续运行。
    • yield和return不可以同时出现

    26.闭包和装饰器

    闭包

    • 闭包函数必须有内嵌函数

    • 内嵌函数必须要引用外层函数的变量

    • 闭包函数返回内嵌函数的地址

      def fun1():
          name = '张三'
          def inner():
              print(name)
          return inner
      
      f = fun1()
      f()
      
      __closure__判断函数是否为闭包函数
      如果是闭包,会返回一个cell对象
      不是闭包,返回None
      

    装饰器

    • 本质上就是以一个闭包函数
    • 在不修改原函数及其调用方式的情况下对原函数功能进行拓展
    • 使用@符号调用

    property装饰器

    • 静态属性:@property。作用就是将类中的无参数方法变成属性使用。

    27.垃圾回收机制

    python采用的是引用计数机制为主,标记-清除分代收集两种机制为辅的策略

    • 引用计数是每定义使用一个对象,引用计数+1,知道为0的时候才会销毁
    • 缺点是具有实时性,简单
    • 但是缺点是维护引用计数消耗资源

    28.二分查找

    def binary_search(arr, search):
        low, high = 0, len(arr) - 1  # 第一次将最极端的两个索引记下来
        while low <= high:
            mid = (low + high) // 2
            if search < arr[mid]:
                high = mid - 1
            elif search > arr[mid]:
                low = mid + 1
            else:
                return mid
        return None
    
    
    a = [1, 2, 3, 4, 5, 6, 7, 8, 15, 45, 86]
    b = 86
    print(binary_search(a, b))
    
    时间复杂度:O(log2n)
    

    29.冒泡排序、选择排序、插入排序

    # 冒泡排序,相邻两两对比
    def bubbleSort(arr):
        for i in range(len(arr)):
            for j in range(0, len(arr) - i - 1):
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr
    
    
    print(bubbleSort([64, 34, 25, 12, 22, 11, 90]))
    
    # 选择排序,选择最小的排好,再选择第二个最小的
    A = [64, 25, 12, 22, 11]
    
    
    def select_sore(arr):
        for i in range(len(arr)):
            min_index = i
            for j in range(i + 1, len(arr)):
                if arr[min_index] > arr[j]:
                    min_index = j
            arr[i], arr[min_index] = arr[min_index], arr[i]
        return arr
    
    
    print(select_sore(A))
    
    
    # 插入排序
    def insertionSort(arr):
        for i in range(1, len(arr)):
            key = arr[i]
            j = i - 1
            while j >= 0 and key < arr[j]:
                arr[j + 1] = arr[j]
                j -= 1
            arr[j + 1] = key
        return arr
    
    
    arr = [12, 11, 13, 5, 6]
    print(insertionSort(arr))
    

    30.排序算法的复杂度

    在这里插入图片描述

    31.Python3和Python2的对比

    • Python3去除print语句,加入print()函数实现相同的功能。
    • Python2 中/的结果是整型,Python3 中是浮点类型。
    • 字符串存储的区别。python2中字符串以 8-bit 字符串存储,python3中字符串以 16-bit Unicode 字符串存储。存储格式得到了升级。
    • 取值范围的区别。python2中用xrange ,python3中用range。如:python2中的 xrange( 0, 4 ) 改为python3中的range(0,4)。
    • 键盘输入的区别。从键盘录入一个字符串,python2中是 raw_input( “hello world” ),python3则是 input( “hello world” )。
    展开全文
  • 钱晓捷新版汇编语言程序设计习题答案(修改) 钱晓捷新版汇编语言程序设计习题答案 第一章 汇编语言基础知识 1.1简述计算机系统硬件组成及各部分作用?... 1.5将下列十六进制数转换为二进制和十进制表示? 1FFH?2
  • 位运算及其应用实例

    2016-08-13 11:53:00
    位运算是C/C++中基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生运算——大多数程序员很少... (2) 进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用,用于将十进制
  • 位运算及其应用实例(1) 摘要 位运算是C/C++中基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生运算——大多数程序员很少使用...(2)进制转换,通过位运算实现将十进制数按二进制和十六进制输出...
  • 摘要 位运算是C/C++中基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生运算——大多数程序员很少使用位运算...(2) 进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用
  • 运算及其应用实例(1) 摘要 位运算是C/C++中基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生运算——大多数程序员很少使用...(2) 进制转换,通过位运算实现将十进制数按二进制和十六进制输出,
  • 考试说明: 单元测试形式为闭卷,考试...将十进制数字210转换为二进制、十六进制、八进制(需在答题纸上写出转换过程) 写出ABC三类IP地址范围及对应默认子网掩码私有保留地址范围? 简述OSI7层参考模型及对应功...
  • 一、选择题 1、 二、简答题 1. if多分支语句switch语句异同之处。 2. breakcontinue语句...1. 从键盘输入某个十进制整数数,转换成对应的二进制整数并输出。 2. 编程求:∑1+∑2+……+∑100。 3. 编写递归...
  • 系统,汇编相比,C 在功能上、结构性、可读性、可维护性上有明显的优 势,因而易学易用。 Keil c51 软件提供丰富的库函数功能强大的集成开发调试工具,全 Windows 界面。另外重要的一点,只要看一下编译后生成的...
  • 9.9 布线方案的优缺点 64 9.10 拓扑悖论 65 9.11 网络接口卡与布线方案 66 9.12 布线方案与其他网络技术 66 9.13 小结 67 练习 67 第10章 局域网扩展:光纤调制解调器、 中继器、网桥及交换机 69 10.1 概述 69 10.2...
  • 二进制的比较复杂),我们得给每个服务都架设一个HTTP代理,也无法利用MicroService的服务发现机制(暴露Zookeeper到公网,非常不安全),必须通过额外的nginx做负载均衡...
  • 4 设菲尔德大学MATLAB遗传算法工具箱(王辉) Matlab 遗传算法(Genetic Algorithm)优化工具箱是基于基本操作及终止条件、二进制和十进制相互转换等操作综合函数库。其实现步骤包括:通过输入及输出函数求出遗传...
  • 程序和进制 - 指令和程序 / 冯诺依曼机 / 二进制和十进制 / 八进制和十六进制 变量和类型 - 变量命名 / 变量使用 / input函数 / 检查变量类型 / 类型转换 数字和字符串 - 整数 / 浮点数 / 复数 / 字符串 / 字符...
  • 1-9 请将以下十进制数值转换为二进制和十六进制补码: (1)2 (2)9 (3)93 (4)-32 (5)65535 (6)-1 解: (1) (2)10 = (10)2 = (2)16 (2) (9)10 = (1001)2 = (9)16 (3) (93)10 = ...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    <br>实验 单链表结构及计算 实验目的: 通过实验掌握下列知识: 1、熟悉线性表基本运算在两种存储结构(顺序结构链式结构)上实现; 2、继续熟悉VC编程、编译调试环境; 内容及步骤:...
  • (4)页式存储管理的优缺点 优点: •虛存量大,适合多道程序运行,用户不必担心内存不够的调度操作; •内存利用率高,不常用的页面尽量不留在内存; •不要求作业连续存放,有效地解决了...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    58 <br>0081 文本中首字母改为大写 59 <br>0082 C#随机数产生 59 <br>0083 身份证从15位升至18位算法 60 <br>0084 十进制数转二进制算法 60 <br>0085 十进制数转八进制数算法 61...
  • asp.net知识库

    2015-06-18 08:45:45
    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据方法 制作一个简单多页Tab功能 一完美关于请求目录不存在而需要url重写解决方案! 在C#中实现MSN消息框功能 XmlHttp实现无刷新三联动ListBox 鼠标...
  • 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体定义字段时候必须指明最大长度n long raw 1~2GB 可变长二进制数据 LOB数据类型 clob 1~4GB 只能存储字符数据 nclob 1~4GB 保存本地语言字符集数据 blob...
  • 07-MySQL服务二进制日志3种工作模式配置方法实战 第部-老男孩MySQL常用引擎及优缺点-应用场景-调优详解(14节) 01-MySQL服务存储引擎介绍 02-MySQL服务存储引擎体系结构 03-MySQL服务MyISAM引擎介绍及磁盘文件...
  • 而Remoting可以利用TCP/IP,二进制传送提高效率。 31.公司要求开发一个继承System.Windows.Forms.ListView类组件,要求达到以下特殊功能:点击ListView各列列头时,能按照点击列每行值进行重排视图中所有行...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题29 请描述一下你自己的优缺点 34 面试题30 你对本公司的了解有多少 34 面试题31 对这份工作的期望与目标何在 34 面试题32 你为什么要离职 34 面试题33 选择这份工作的原因是什么 35 面试题34 你认为相关产业的...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

二进制和十进制的优缺点