赋值语句

Python3运算符

荒凉一梦 提交于 2020-02-15 00:56:56
Python3 运算符 什么是运算符? Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 Python算术运算符 以下假设变量a为10,变量b为21: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 31 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -11 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 210 / 除 - x 除以 y b / a 输出结果 2.1 % 取模 - 返回除法的余数 b % a 输出结果 1 ** 幂 - 返回x的y次幂 a**b 为10的21次方 // 取整除 - 向下取接近除数的整数 >>> 9//2 4 >>> -9//2 -5 以下实例演示了Python所有算术运算符的操作: 实例(Python 3.0+) # 算术运算符 # + 加法运算符(如果是两个字符串之间进行加法运算,则会进行拼串操作) # - 减法运算符 # * 乘法运算符(如果将字符串和数字相乘,则会对字符串进行复制操作,将字符串重复指定次数) # / 除法运算符,运算时结果总会返回一个浮点类型 # // 整除,只会保留计算后的整数位,总会返回一个整型 # ** 幂运算,求一个值的几次幂 # % 取模

c++11 右值引用、移动语义和完美转发

て烟熏妆下的殇ゞ 提交于 2020-02-14 03:19:49
c++11 右值引用、移动语义和完美转发 作者:StormZhu 链接:https://www.jianshu.com/p/d19fc8447eaa c++中引入了 右值引用 和 移动语义 ,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。 左值、右值 C++ 中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的 持久化对象 ,右值是指表达式结束时就不再存在的 临时对象 。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法: 看能不能对表达式取地址,如果能,则为左值,否则为右值 。 看见书上又将右值分为将亡值和纯右值。纯右值就是 c++98 标准中右值的概念,如非引用返回的函数返回的临时变量值;一些运算表达式,如1+2产生的临时变量;不跟对象关联的字面量值,如2,'c',true,"hello";这些值都不能够被取地址。 而将亡值则是 c++11 新增的和右值引用相关的表达式,这样的表达式通常时将要移动的对象、 T&& 函数返回值、 std::move() 函数的返回值等, 不懂将亡值和纯右值的区别其实没关系,统一看作右值即可,不影响使用。 示例: int i=0;// i是左值, 0是右值 class A { public: int a; }; A getTemp() {

[转][c++11]我理解的右值引用、移动语义和完美转发

自作多情 提交于 2020-02-13 22:25:42
c++中引入了 右值引用 和 移动语义 ,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。 左值、右值 C++ 中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的 持久化对象 ,右值是指表达式结束时就不再存在的 临时对象 。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法: 看能不能对表达式取地址,如果能,则为左值,否则为右值 。 看见书上又将右值分为将亡值和纯右值。纯右值就是 c++98 标准中右值的概念,如非引用返回的函数返回的临时变量值;一些运算表达式,如1+2产生的临时变量;不跟对象关联的字面量值,如2,'c',true,"hello";这些值都不能够被取地址。 而将亡值则是 c++11 新增的和右值引用相关的表达式,这样的表达式通常时将要移动的对象、 T&& 函数返回值、 std::move() 函数的返回值等, 不懂将亡值和纯右值的区别其实没关系,统一看作右值即可,不影响使用。 示例: int i=0;// i是左值, 0是右值 class A { public: int a; }; A getTemp() { return A(); } A a = getTemp(); // a是左值 getTemp()的返回值是右值(临时变量)   左值引用、右值引用

如何消除毛刺

主宰稳场 提交于 2020-02-13 18:46:04
建立时间(setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;保持时间(hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被打入触发器。数据稳定传输必须满足建立时间和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。   1.PLD内部产生毛刺的原因     使用分立元件设计数字系统时,由于PCB走线时存在分布电感和电容,所以几纳秒的毛刺将自然滤除,而在PLD内部并无分布电感和电容,所以在PLD/FPGA设计中,竞争和冒险问题将变得较为突出。   2.PLD内部毛刺的消除     一种常见的方法是利用D触发器的D输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。   在仿真时,也可能会发现在FPGA器件对外输出引脚上有输出毛刺,但由于毛刺很短,加上PCB本身的寄生参数,大多数情况下,毛刺通过PCB走线基本可以被自然滤除,不用再外加阻容滤波。   优秀的设计方案,如采用格雷码计数器、同步电路,可以大大减少毛刺,但并不能完全消除毛刺。毛刺并不是对所有输入都有危害,例如D触发器的D输入端,只要毛刺不能出现在时钟的上升沿并且满足数据的建立和保持时间

ES6笔记(3)-- 解构赋值

最后都变了- 提交于 2020-02-12 21:11:42
系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组、对象、字符串的解构赋值等 一、数组的解构赋值 function ids() { return [1, 2, 3]; } var [id1, id2, id3] = ids(); console.log(id1, id2, id3); // 1 2 3 如上,解析返回的数组,取出值并赋给相应的变量,这就是解构赋值 1. 还可以嵌套多层 ,只要相应的模式匹配了就能解析出来 var [a, [b, [c]]] = [1, [2, [3]]]; a // 1 b // 2 c // 3 2. 如若模式不匹配则报错 var [a, [b, [c]]] = [1, [2, 3]]; // Uncaught TypeError: undefined is not a function a 其实,解构赋值内部的实现方式使用到了ES6的 Iterator迭代器 ,通过层层遍历,保证了相应值的获取 3. 解构不成功,但模式匹配了,相应值为undefined var [a, b] = [1]; a // 1 b // undefined 4. 不需要匹配的位置可以置空 var [, b] = [1, 2]; b // 2 5. 使用 ... 这个扩展运算符,匹配余下的所以值,形成一个数组

构造/析构/赋值运算

左心房为你撑大大i 提交于 2020-02-12 17:33:29
条款05:了解C++默默编写并调用哪些函数   如果你没有声明任何构造函数,编译器也会成为你声明一个默认构造函数,默认构造函数和析构函数主要给编译器一个地方用来放置“藏身幕后”的代码,像是调用base classes和non-static成员变量的构造函数和析构函数。所有这些函数都是public且inline,编译器产生出来的析构函数是non-virtual,除非这个class的base class自身声明有virtual析构函数。   惟有当这些函数被需要(被调用),它们才会被编译器创建出来。即有需求,编译器才会创建它们。   至于拷贝构造函数和拷贝赋值操作符,编译器创建的版本只是单纯地将来源对象的每一个非静态成员变量拷贝到目标对象。   如一个类声明了一个构造函数(无论有没参数),编译器就不再为它创建默认构造函数。   编译器生成的拷贝赋值操作符:对于成员变量中有指针,引用,常量类型,我们都应考虑建立自己“合适”的拷贝赋值操作符。因为指向同块内存的指针是个潜在危险,引用不可改变,常量不可改变。 请记住:   编译器可以暗自为类创建默认构造函数、拷贝构造函数、拷贝赋值操作符,以及析构函数。 条款06:若不想使用编译器自动生成的函数,就该明确拒绝   通常如果你不希望类支持某一特定技能,只要不说明对应函数就是了。但这个策略对拷贝构造函数和拷贝赋值操作符却不起作用。因为编译器会

C++赋值函数详解

隐身守侯 提交于 2020-02-10 05:35:19
赋值函数 每个类只有一个赋值函数   由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。    1,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。 以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world”。    现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。 这将造成三个错误: 一是b.m_data原有的内存没被释放,造成内存泄露; 二是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方; 三是在对象被析构时,m_data被释放了两次。    2,拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三个语句和第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋值函数吗?     String a(“hello”);    String b(“world”); String c = a;   // 调用了拷贝构造函数,最好写成 c(a);    c = b;      // 调用了赋值函数    本例中第三个语句的风格较差

python的命名空间

我们两清 提交于 2020-02-10 01:59:20
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。 接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间 重点是第四部分,我们将在此部分观察命名空间的内容。 一、命名空间 Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。 A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。 在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。 1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。 2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。 3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。 二、命名空间查找顺序 当一行代码要使用变量 x 的值时

verilog HDL入门

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-09 17:17:28
verilog HDL入门 特点 类C语言 并行执行 硬件描述 设计流程 : 自顶向下 前提 :懂C语言和简单的数电知识 简单体验 语法很类似C语言,同时不难看出描述的是一个多路选择器 module muxtwo (out, a, b, s1); input a,b,s1; output out; reg out; always @(s1 or a or b) if(!s1) out = a; else out = b; endmodule 注意 没考虑时延问题 没有说明如果输入a或b是三态的(高阻时)输出应该是什么。 一 入门例子 例1. 多路选择器 描述一个多路选择器,控制信号sel,输入信号in0、in1, 输出信号out module mux(out, in0, in1, sel); parameter N=8; output[N:1] out; input[N:1] in0, in1; input sel; assign out=sel?in1:in0; endmodule 例2. 4位二进制加法计数器(带同步清0) 进位输出:当q为最大值(15)且cin=1时,cout=1;否则cout=0 module counter(q, cout, reset, cin, clk); parameter N=4; input reset, cin, clk; output

Cracking Digital VLSI Verification Interview 第四章

元气小坏坏 提交于 2020-02-08 16:18:52
目录 Hardware Description Languages Verilog SystemVerilog 对Cracking Digital VLSI Verification Interview:Interview Success这本书的汉化,最新更新请关注微信公众号 摸鱼范式 Hardware Description Languages Verilog [159] verilog中的阻塞赋值和非阻塞赋值有什么区别? verilog支持阻塞与非阻塞两种赋值方式。使用阻塞赋值时,计算和赋值会立刻执行。因此但是顺序执行块中由多个阻塞赋值,他们会按照阻塞的方式顺序执行。如下所示。 always @(posedge clk) begin x = a|b; y = a&b; z = x|y; end 在这个例子中,所有赋值都采用的时阻塞赋值,执行时会立刻进行计算,然后完成赋值操作。因此在第三条语句中,会将前两条语句中更新后的x和y用于第三条语句的计算并赋值。 在非阻塞赋值中,所有的赋值都将在当前的仿真时刻的最后执行。首先对右侧的表达式进行计算,然后才对左侧进行赋值,因此在下面的例子中,三条语句都先进行右侧语句的计算,然后再一起对左侧进行赋值操作。结果就是,第三条语句所采用的x和y是一个旧值,并不是前两条语句在这个仿真时刻改变后的值。 always @(posedge clk)