变量、运算符与数据类型、位运算

  • 1.注释
  • 2.运算符
  • 算术运算符
  • 比较运算符
  • 位运算符
  • 三元运算符
  • 变量和赋值
  • 3.位运算
  • 原码、反码、补码
  • 按位与、或、非、异或


1.注释

代码中,# 用于单行注释,’’’ ‘’’""" “”" 表示区间注释,用于多行注释

2.运算符

算术运算符

包括 +、-、*、/、//(取整)、**(幂)

比较运算符

包括 >、>=、<、<=、==、!=,返回的是 布尔类型

位运算符

~ 按位取反
& 按位与
| 按位或
^ 按位异或
<< 左移
.>>右移

~取反运算符:
二进制数在内存中以补码的形式存在;
正数的原码、补码和反码都相同;
负数的反码和原码符号位相同,数值取反,补码是在反码的基础上加1 按位取反运算符~ ~4:
转二进制:0 0100
计算补码:0 0100
按位取反:1 1011
转为原码:1 1011
按位取反:1 0100
计算补码:1 0101
规律:~x=-(x+1)

三元运算符

if-else语句合并

x, y = 4, 5
if x < y:
    small = x
else:
    small = y

print(small)  # 4

x, y = 4, 5
small = x if x < y else y
print(small)  # 4

in(存在),not in(不存在),代替for进行遍历

letters = ['A', 'B', 'C']
if 'A' in letters:
    print('A' + ' exists')
if 'h' not in letters:
    print('h' + ' not exists') 
# A exists  
# h not exists

is(是),is not(不是)

x, y = 4, 5
small = x if x < y else y
print(small)  # 4

letters = ['A', 'B', 'C']
if 'A' in letters:
    print('A' + ' exists')
if 'h' not in letters:
    print('h' + ' not exists')

# A exists
# h not exists

在讲is和==这两种运算符区别之前,首先要知道 Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

== 是python标准操作符中的比较操作符,用来比较判断 两个对象的value(值)是否相等,例如下面两个字符串间的比较:
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是 id是否相同。
Python中is和==的区别

>>> a = 1 #a和b为数值类型
>>> b = 1
>>> a is b
True

>>> a = (1,2,3) #a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False

只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False。

变量和赋值

Python 中不需要提前声明变量类型,变量的赋值和声明同时进行
变量名可以包括字母,数字,下划线,但不能是数字开头
int、float、bool

整形(int)
使用print(a)查看变量a的值,使用type(a) 查看变量a的类型;
将整形看成一个对象,对象就应该包括 属性(attributes)和方法(methods),利用dir()查看属性和方法

浮点型(float)
布尔型变量True,False可以直接用于数学运算代表1,0

print(True + True) # 2

利用bool(x)来创建变量True,False,其中x分为两种:

基本类型:整型、浮点型、布尔型
容器类型:字符串、元组、列表、字典和集合

对于数值变量,0, 0.0 都可认为是空的。
对于容器变量,里面没元素就是空的。

3.位运算

原码、反码、补码

二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示;
原码: 就是其二进制表示(注意,最高位是符号位);
反码: 正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反);
补码: 正数的补码就是原码,负数的补码是反码+1。
正数的原码、反码、补码都一样;负数反码是符号位不变,其余位取反,补码是反码+1

按位与、或、非、异或
/**
 * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
 *
 * 说明:
 *
 * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
 *
 */
 public static int singleNumber(int[] nums) {
            int num = 0;
            for (int i = 0; i < nums.length; i++){
                /*
                涉及到异或运算,对于这道题,你应该了解异或有什么样性质
                1. 任何数与0异或,都为原数
                2. 与本身自己异或,则为0
                3. 交换律和结合律(解决这道题的关键),你把整个循环的计算写成数学运算过程,你会发现要利用交换律
                结合律,可以实现这道题的要求
                 */
                num ^= nums[i];
            }
            return num;
        }
        //进行测试
        public static void main(String[] args) {
            int[] nums = {1,1,2,3,4,4,3,2,5};
            System.out.println(singleNumber(nums));
        }