标签归档 python

通过seo圣人

Python用raw_input获取键盘输入报错怎么办?

在学习python的时候使用raw_input来获取键盘输入,结果出现了下面的报错:

Traceback (most recent call last):
  File "******\***.py", line 19, in <module>
    j = raw_input("aa")
NameError: name 'raw_input' is not defined

遇到这样的问题让我束手无策,翻阅了大量的资料发现是环境的问题,原来Python从3.0开始抛弃了raw_input这个函数,input函数取而代之,代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def sum(n):
    if (n == 1):
        s=1
    else:
        s = n * sum(n-1)
    return s

i = input("请输入:")
j = sum(i)
print (j)

看了官方的手册,写出了上面的代码,结果又是报错,报错代码如下:

Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\ding\1.py", line 16, in <module>
    j = sum(b)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\ding\1.py", line 9, in sum
    s = n * sum(n-1)
TypeError: unsupported operand type(s) for -: 'str' and 'int'

无奈之下,继续看官方手册对input的介绍,原来官方对input的解释是这样的:

 input([prompt]) 函数和 raw_input([prompt]) 函数基本类似,但是 input 可以接收一个Python表达式作为输入,并将运算结果返回。 input函数返回的是字符串。

说input返回的是一个字符串,而不是int型的,因此才会报错,知道这个问题就好办了,咱们把获取的字符串转换成int型问题就解决了,代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-


def sum(n):
    if (n == 1):
        s=1
    else:
        s = n * sum(n-1)
    return s


i = input("请输入:")
b = int(i)
j = sum(b)
print (j)

到这里,问题彻底解决!总结:在Python环境中,读取键盘输入的函数有raw_input和input两个,在python3里面,函数raw_input已经被丢弃,而input函数从键盘中读取的字符默认为string型。因此读取键盘输入的数据需要根据你的实际环境来写,如果用input来获取字符,记得转换类型!

通过seo圣人

位运算与位移怎样理解?

在python中,位运算分为按位与运算(&)、按位或运算(|)、按位异或运算(^)、按位取反运算(~)、按位左移运算(<<)和按位右移运算(>>),当然了在别的编程语言里面也有涉及这个知识点,譬如C语言、PHP语言、JAVA语言等等,原理都是想通的,俗话说的好“温故而知新”,我在这里把这个知识点再强调一遍。

学过计算机的人对二进制并不陌生,这个位运算其实就是基于二进制的,那么我们在python代码中什么两个变量,方便我们通过实验来讲解位运算:
a = 623 #变量a的二进制为:0010 0110 1111
b = 139 #变量b的二进制为:0000 1000 1011

1、按位与运算(&)
我们先把a和b进行按位于运算,也就是
print a&b #打印的结果是11
为什么结果是11呢?其实在按位与运算中,参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0,那么a和b进行按位与运算之后的二进制就是“0000 0000 1011”,将这个二进制的数字转换成十进制结果就是11。请看下面的按位与运算图解:

2、按位或运算(|)
print a|b # 打印结果是751
在按位或运算中,只要对应的二个二进位有一个为1时,结果位就为1。那么a和b进行按位或运算的的二进制结果就为0010 1110 1111,转换为二进制的结果就是751。请看下面的按位或运算图解:

3、按位异或运算(^)
print a^b # 运算结果为740
在按位异或运算中,当两对应的二进位相异时,结果为1,相同则为0,那么a和b进行按位异或运算的二进制结果就为0010 1110 0100,转换为二进制的结果就为740。请看下面的按位异或运算图解:

4、按位取反运算(~)
print ~a # 运算结果为-624
print ~b # 运算结果为-140
在按位取反运算中,对数据的每个二进制位取反,即把1变为0,把0变为1 。~a的二进制按位取反运算后的二进制结果为1111 1101 1001 0000转换为10进制的结果是-624,~b的二进制按位取反运算后的二进制结果为1111 0111 0100,转换为十进制的结果为-140,这里涉及到反码、补码知识,忘记了的同学请自行恶补!请看下面的按位取反运算图解:

5、按位左移运算(<<)
print a<<b #运算结果为434167633083893069286773515120622788069556224
在左移动运算中,运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。因为数字太大了,我就懒得写了。

6、按位右移运算(>>)
print a>>b #运算结果为0
在右移动运算中,把”>>”左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数,这个数字推算起来也不得了,我也就不多写了,你知道是怎么回事就行了。

 a<<b其实就是把a转换成二进制,向左移动139位,然后在转换成十进制。
 a>>b其实就是把a转换成二进制,向右移动139位,然后在转换成十进制。

因为例子中的数字太大,我现在把数字变小一点,方便大家理解
a=11 #二进制为1011
b=3  #二进制为11
那么a<<b的运算结果如下:
0000 0000 1011
向左边移动3个位置,结果就为:
0000 0101 1000
转换成十进制就等于88

a>>b的运算结果如下:
那么a>>b的运算结果如下:
0000 0000 1011
向右边边移动3个位置,结果就为:
0000 0000 0001

转换成十进制就等于1

针对python的位运算今天就讲这么多,如果你还有不明白的,欢迎在下方留言,咱们一起学习,共同研究!