python编程基础第二天

位运算和条件循环结构

昨天忘了学位运算,今天补上。位运算有些复杂,但是搞懂计算原理也比较容易。所以尽量去算就好了,难点不能放过!!!

1、位运算

原码、反码、补码

原码是对数字进行二进制转换,1=1,10=2,11=3,100=4,101=5,110=6,111=7,1000=8.

符号位,最高位为符号位,0表示正,1表示负,位运算中,符号参与运算。如:
00000011=3
10000011=-3

反码:正数的反码为原码,负数反码为符号位不变,其余位取反:
如3的反码:00000011
-3的反码: 11111100

补码:正数的补码为原码,负数的补码为反码加1.
如3的补码:00000011
-3的补码: 111111101

按位非操作:

~ :
1、对数字的二进制取补码
2、按位取反(这里的“取反”与“反码”不同),全部取反,0变成1,1变成 0,符号位也取反。
3、取补码

举例:
~3
3的二进制00000011,取补码00000011,按位取反11111100,取补码:因为11111100为负数,所以是其反码+1,11111100的反码10000011,+1为100000100,即为-4.

print(~3,~4,~5,~6,~0)#  -4  -5  -6  -7  -1

~-3
-3的二进制10000011,取补码11111101,按位取反00000010,取补码00000010,即为2

print(~-3,~-4,~-5,~-1)# 2 3 4 0

可以理解为~n=-(n+1)

按位与操作

&,取两个数的二进制相同的位置,不同的取0
5&6:00000101&00000110=00000100=4
在这里插入图片描述

按位或运算

|,只要对应位有1,就为1
5|6:00000101|00000110=00000111=7
在这里插入图片描述

按位异或

^,对应位的数相同就为0,不同为1.
5^6: 00000101 ^ 00000110=00000011=3

异或操作满足交换律和结合律:
A ^ B ^A=A ^ A ^ B=B

在这里插入图片描述

按位左移/右移操作

num>>i,将数字num的二进制向右移i位
2>>1,00000010>>1=00000001=1
2<<1,00000010<<1=00000100=4
在这里插入图片描述

利用位运算进行快速计算

利用>>,<<计算2的倍数问题

n*2:n<<1
n/2:n>>1

n>>m:n/(2^m)
n<<m:n*(2^m)
在这里插入图片描述

利用位运算进行整数集合

一个数的二进制可以看做一个集合(0表示不在集合中,1表示在集合中)
如(1,3,4,8)可以表示为 0100011010
对集合进行操作:

元素与集合之间的操作:
a | (1<<a) 把i插入集合中
a & ~(1<<a) 把从集合中删除
a & (1<<i) 判断i是否属于该集合( 0不属于,非0 属于)

集合与集合之间的操作:
a补 ~a
a交b a&b
a并b a|b
a差b a & (~b)
整数在内存中是以补码的形式存在的,输出也是按照补码输出。

2、条件循环结构

条件语句

if语句

 a=3
b=4
if a<b and a>0:
    print("y")
else:
    print("n")

y

多个if语句:

if a>b:
    if a==0:
        if b>5:
            print(a)
        else: print(b)
    else: print("y")
else: print("n")

n

assert 关键词

断言,当这个关键词后面的条件为False,程序自动崩溃并抛出AssertionError的异常
在这里插入图片描述

循环语句

while语句

a=3
b=4
while a>0:
    m=input("please input a number:")
    m=int(m)
    if m > 0:
        print(m)
    else:
        print("please input a number bigger than 0")
    break
else:
    print(b)

这里需要在循环语句中加入停止Break,不然程序会一直运行。

for循环

数组:

a=['x','y','z']
for i in a:
    print(i)
#
for i in range(len(a)):
    print(a[i])

字典:

m={'x':1,'y':2,'z':3}
for key,value in m.items():
    print(key,value,sep=':',end=' ')

for key in m.keys():
    print(key,end=' ')

for value in m.values():
    print(value,end=' ')
x:1 y:2 z:3 x y z 1 2 3 

for -else 循环:

当for循环正常执行完的情况下,执行else输出,如果for循环执行了跳出循环的语句,比如break,将不执行else的内容。与while-else一样。

for num in range(1,10):
    for i in range(2,num):
        if num%i==0:
            j=num/i
            print("in %d"%(i))
            break
    else:
        print("out %d"%(num))

输出结果为:

out 1
out 2
out 3
in 2
out 5
in 2
out 7
in 2
in 3

range 函数:
range 这个BIF的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列,该序列包含start的值但不包含stop的值。

for i in range(2,9):
    print(i)

输出结果为:

2
3
4
5
6
7
8

不包含9。

for i in range(2,9,2):
    print(i)

输出结果为:

2
4
6
8

最后一个参数为步长。

enumerate函数
enumerate(sequence, [start=0])
返回枚举对象

a=['x','y','z']
lst=list(enumerate(a))
print(lst)
lst_1=list(enumerate(a,start=2))
print(lst_1)

输出结果为:

[(0, 'x'), (1, 'y'), (2, 'z')]
[(2, 'x'), (3, 'y'), (4, 'z')]

用 enumerate(A) 不仅返回了 A 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 enumerate(A, j) 还可以确定索引起始值为 j。

a=['x','y','z']
for i in a:
    print('input',i)
print('over')

for i,j in enumerate(a,1):
    print(i,'input',j)
print('over')

输出结果为:

input x
input y
input z
over
1 input x
2 input y
3 input z
over

break语句
跳出所在层的循环。

import random
m=random.randint(1,10)
while True:
    number=input('please input a number:')
    number=int(number)
    if number==m:
        print('good')
        break
    else:
        print('try again!')
print('over')

猜数字游戏结果:

please input a number:3
try again!
please input a number:3
try again!
please input a number:2
try again!
please input a number:1
try again!
please input a number:7
good
over

continue语句:

continue终止本轮循环并开始下一轮循环。

for i in range(1,10):
    if i%2!=0:
        print(i)
        continue
    i=i+10
    print(i)

输出:

1
12
3
14
5
16
7
18
9

pass语句:

pass 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的。

def fun(x):
    pass

推导式:

x=[-3,-2,0,2,3]
y=[a**3 for a in x]
z=[i**2 for i in range(10)]
m=[(i,i**2) for i in range(10)]
n=[i for i in range(10) if (i%2==0) and (i%3==0)]

p=[[i,j] for i in range(2) for j in range(3)]
q=[[i,j] for i in range(3) if i>1 for j in range(5) if j>i ]
print(y,'\n',z,'\n',m,'\n',n,'\n',p,'\n',q)

输出结果为:

x=[-3,-2,0,2,3]
y=[a**3 for a in x]
z=[i**2 for i in range(10)]
m=[(i,i**2) for i in range(10)]
n=[i for i in range(10) if (i%2==0) and (i%3==0)]

p=[[i,j] for i in range(2) for j in range(3)]
q=[[i,j] for i in range(3) if i>1 for j in range(5) if j>i ]
print(y,'\n',z,'\n',m,'\n',n,'\n',p,'\n',q)

字典推导式:

b={i: i%2==0 for i in range(10) if i%3==0}
print(b)

输出:

{0: True, 3: False, 6: True, 9: False}

集合推导式:

c={i for i in [1,2,3,43,2,12,2]}
print(c)

结果为:

{1, 2, 3, 43, 12}

今天学的比较多,多练习才能好好掌握!!加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值