Python基础

Python 是什么类型的语言?

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,通常说Python是一种脚本语言,喜欢Python的人,更喜欢称它为一种高级动态编程语言,或者亲切的叫“胶水语言”,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。那大家为什么这么喜欢Python呢?

大家可以参考白月黑羽教程-为什么学Python?

Python2和Python3的区别

目前的主流版本 是 Python 2 和 Python 3 。 其中Python 3 是 Python 2的 升级版,语法和库有一些差异,不兼容Python 2。

目前 仍有大量 开发者 还在使用 Python 2。 所以,Python组织还在维护 Python 2。造成了Python 2 和 Python 3 并存的状态。

但是 整个业界都在 往 Python 3 转,是大势所趋。 而且Python组织官方宣布,到2020年,不再维护 Python2了,所以初学者可以直接学习Python 3

参考白月黑羽Python3教程 - Python简史了解更多

Python3.7 目前是最新版本, 但是我们教程还是使用 python3.6 而不是 3.7。 具体原因,请参考白月黑羽Python3教程 -好文分享专栏中Python3.6 还是 Python 3.7

什么是IDLE?

IDLE是一个Python解释器内置的一个Shell环境,可以加载和执行Python的代码,类似于linux shell和windows下的dos command环境,IDLE还提供了人机交互的接口,接收键盘输入,让用户有机会提供一些程序运行所需要的参数信息。

他是Python解释器的一个内置函数,用于输入和调试,调用该函数,将打印括号内的信息到屏幕上或者调试器的输出窗口,可参考白月黑羽Python3教程 - 查看系统关键字和内置函数

Python中表示*的作用是什么?

如果是在数字对象,则表示两个数字相乘,如果是字符串对象,表示生成一个新的字符串,*后面的数字表示字符串重复的次数,示例如下

print(2*3)
print('Learn Python with BYHY !\n'  *3) 

输出结果

6
Learn Python with BYHY !
Learn Python with BYHY !
Learn Python with BYHY !

print(‘Learn Python with BYHY from ‘ + 2019) 却报错?

Python中’+’表示将两个字符串类型的数据对象拼接在一起,如果不是字符串对象就会报错,错误提示如下所示

print('Learn Python with BYHY from ' + 2019)
TypeError: must be str, not int

通常我们会将非字符串类型的数据对象进行强制类型转换,如下所示

print('Learn Python with BYHY from ' + str(2019))

请参考白月黑羽Python3教程 - 字符串章节的内容。

如果一个字符串中嵌入一个双引号或者双引号,怎么办?

如果需要嵌入一个双引号,可以用单引号将字符串包裹起来

如果需要嵌入一个单引号,可以用双引号将字符串包裹起来

当然也可以直接用三对单引号,或者三对双引号把字符串包裹起来

请参考白月黑羽Python3教程 - 字符串章节中字符串定义的相关内容。

Python是大小写敏感的语言

敏感这个词在中文的意思大家肯定不陌生,比如有人对某种香水过敏,那喷过该种美女从他身边走过,他就会不停的打喷嚏,这就是日常生活中的过敏。

那对应Python来说,如果定义一个变量叫‘BYHY’,如果我们在用的时候写成了‘byhy’,这时解释器就会告诉我们,说:hi,你是谁?之前怎么没见过你呀?为什么会这样呢?因为解释器认为‘BYHY’和‘byhy’是两个不同的变量。

Python为什么要设计成大小写敏感的语言呢,这是因为Python是一种跨平台的开发语言,如果想让你的程序在多个平台可以执行,那就必须按照人家的规则来编写代码呀。我们知道,在Linux下面,所有的对象的名字都是区分大小写的,Python设计之初,就是设计是一种跨平台的开发语言,我们的吉多大神,当然要严肃对待这个规则了。

大家也可以参考白月黑羽Python3教程 - 变量命名规则有这部分的说明。

神奇且重要的缩进

缩进又叫indent,是Python的语法规则,必须遵守。如果你运行代码的时候出现如下错误,就是表示缩进不一致,需要排查清除。

IndentationError: unexpected indent

在Python的PEP8规范中要求4个空格为语句块缩进,通常在用在赋值语句(即等于号 前后空一个空格),函数参数(逗号后,空一个空格),还有其它的,请参考PEP8规范.

强烈建议初学者在每个缩进层次使用四个空格, 实际工作坚持地使用它,形成一种习惯,如果开始就是tab键和空间键混用,经常造成的缩进不一致的情况。

Python自动帮你识别“=”和“==”的潜在逻辑错误

工作中有时会不小心把“==”误写成“=”吗?他们的不同,不言而明

  • ==:是判断是否相等
  • =: 是用于赋值

如果学过C语言的同学,应该知道while( var1 == 1 )和while( var1 = 1 ),程序就完全不一样,一个是正常的判断,另外一个就是死循环,结果大相径庭。但在 Python 这里,大家完全不用担心,Python解释器会自动识别,遇到这种情况,坚决报错

    while(var1 = 1):
            ^
SyntaxError: invalid syntax

我们的吉多大神是不是为我们考虑的很周全,直接帮我们解决了,这么好的语言,还不开始和白月黑羽一起学 :)

从键盘接收输入用户名并打印

从键盘接收,需要用到内置函数input

user_name = input('Please input your name: ')
print(f'your name is : {user_name}')

输出结果:

Please input your name: sk
your name is : sk

从键盘接收输入用户名,并判断输入是否有效

从键盘接收,需要用到内置函数input

user_name = input('Please input your name: ')
if user_name:
    print(f'hello {user_name}, welcome to www.python3.vip')
else:
    print(f'!!!error, input error.')

演示结果1

Please input your name: sk
hello sk, welcome to www.python3.vip

Process finished with exit code 0

演示结果2

Please input your name: 
!!!error, input error.

Process finished with exit code 0

如何在字符串中输出反斜杠

通常在路径中需要输入反斜杠,通常可以这样处理路径

print(r'c\windows') # 字符串前加r 表示不转义
print('c\\windows') # 2个反斜杠
print('c:/windows') # 在windows下面也可以识别目录

输出结果:

c:\windows
c:\windows
c:/windows

最简便的方式实现死循环

方式1:

while 1:
    print('I really love BYHY!')

方式2:

while True:
    print('I really love BYHY!')

方式3:

while 'byhy': # 非零或非空
    print('I really love BYHY!')

当Python程序陷入死循环时有两种解决方案:

方案一:使用Ctrl+C快捷键的方式退出程序

方案二:强制结束Python程序

什么情况下需要死循环

死循环通常用于始终需要做同一件事的情况,例如:

  1. 用于游戏中,时刻接收用户输入,确保游戏“在线”
  2. 操作系统时刻接收用户的键盘输入
  3. Web或者通讯服务器时刻准备接收客户端的连接

具体如何跳出循环,可参考白月黑羽Python3教程 - 循环

Python3 中,一行可以书写多个语句吗?

可以,但是要用逗号隔开

print('Life is short, I uses Python');print('Learn python with BYHY!')

Python3 中,一条语句可以多行显示吗?

也是可以的,但是要用连接符(),如果该条语句的长度超过一行的时候,一般IDE自动添加该连接符,当然也可以手动添加,让其换行

print('Please join me to Learn python with BYHY! Learn python with BYHY!Learn python with BYHY!Learn python with BYHY!Learn python with BYHY!')

print('Please join \
me to Learn python with BYHY! Learn python \
with BYHY!Learn python with BYHY!Learn python with BYHY!Learn python with BYHY!')

print函数打印信息默认添加一个换行符,是否可以不要换行符

当然可以,可用用end=” “参数告诉print()用你想要的任何字符代替换行符

print('Learn python with BYHY!')
print('Learn python with BYHY!')

print('Learn python with BYHY!', end=' - once again -  ')
print('Learn python with BYHY!')

输出结果:

Learn python with BYHY!
Learn python with BYHY!
Learn python with BYHY! - once again -  Learn python with BYHY!

猜我心里的数字是几?

自己心里想一个1-10之间的数字,让别人猜,三次机会

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import random

times = 3
my_num = random.randint(1,10) # 随机取一个1-10之间的一个数字
print(my_num)
print('------------------白月黑羽教Python - 猜猜我心里是几(1-10)?------------------')

guess_num = 0

while (guess_num != my_num) and (times > 0):
    temp = input("你猜我心里想的是几?:")

    # try-except 确保用户不是非空输入
    try:
        guess_num = int(temp)
        times = times - 1 # 用户只有3次机会
        if guess_num == my_num:
            print("牛掰,居然被你猜到了!")
        else:
            if guess_num > my_num:
                print("不对不对,有点大 ", end=' - ')
            else:
                print("不对不对,有点小 ", end=' - ')
            if times > 0:
                print("再试一次吧, 请继续... ")
            else:
                print("没机会了,下次再试吧!")
    except:
        print('!!! 输入错误, 不能为空的哟')

print("Game Over!")

请列举出Python3的基础数据类型最少3个

Python3中基础的数据类型有:

  1. 整数
  2. 浮点数
  3. 字符串
  4. 列表
  5. 元组
  6. 字典
  7. 布尔

详情可以参考白月黑羽Python3教程中的对象类型的内容了解

Python2和Python3的布尔数据类型的True和False有什么不同?

在Python2中,True 和 False是内建变量,可以和别的变量一样进行赋值和运算

在Python3中,被改成关键字了,就不能随便赋值,就规避了一些潜在问题。如果强制赋值和运算,就会报语法错误,可以通过iskeyword方法来进行判断

import keyword
keyword.iskeyword('True')

int()强制类型转换的时候,小数是如何取舍的?

使用 int() 将小数转换为整数,小数取整会采用比较暴力的截断方式,即小数点后面的会被强制舍去,向下取整。

例如:5.5向上取整为6,向下取整为5,int(5.5) 结果为5,不会为6

小技巧

如果想要让其按照人类的思维“四舍五入”,可以采用+ 0.5的方法,示例如下

5.4 “四舍五入”结果为:5,int(5.4+0.5) == 5

5.6 “四舍五入”结果为:6,int(5.6+0.5) == 6

Python3中isinstance 和 type 的区别

基本数据类型

  • type()是一个内置函数,可以用来查询变量所指的对象类型
  • isinstance()是用来判断该变量是否为某种数据类型
# type
print(type(1), type(True), type([1,2,3]))

# isinstance
print(isinstance(1, int))
print(isinstance(True, bool))
print(isinstance([1,2,3], tuple))

输出结果

<class 'int'> <class 'bool'> <class 'list'>
True
True
False

自定义类

对于自定义类,type()认为子类和父类不是一种类型,而isinstance()认为子类一种父类类型

# 父类
class A:
    pass

# 子类
class B(A):
    pass

print(type(A()) == A)  # returns True
print(isinstance(A(), A))  # returns True
print(type(B()) == A) # returns False
print(isinstance(B(), A))  # returns True

判断给定年份是否为闰年

闰年的定义:在公历(格里历)纪年中,有闰日的年份叫闰年,一般年份365天,闰年为366天。

闰年的计算方法:公元纪年的年数可以被四整除,即为闰年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。

temp_year = input('请输入一个年份:')

if not temp_year.isdigit():
    temp_year = input("您的输入有误,请重新输入年份:")

year = int(temp_year)
if (year % 4) == 0:  # 能被4整除
   if (year % 100) == 0: # 能被100整除
       if (year % 400) == 0: # 能被400整除
           print(f"{year} 是闰年")
       else:
           print(f"{year} 不是闰年")
   else:
       print(f"{year} 是闰年")
else:
    print(f"{year} 不是闰年")

如何求算术运算中的商和余数

可以参考白月黑羽Python3教程 - 数学运算这部分的介绍:

  • ‘/’ 除法,结果为浮点数
  • ‘//’ 求商
  • ‘%’ 求余

示例如下:

# 除法,注意结果是小数
print(3 / 2) # 1.5

# 只需要得到商的除法
print(3 // 2) # 1

# 只需要得到余数的除法
print(3 % 2) # 1

把表达式a < b < c拆开

(a < b) and (b < c)

not and 和 or 的优先级

not > and > or

如何快速的判断一个数是奇数还是偶数?

利用求余的方法,能被 2 整除为偶数,所以 x % 2 == 0,否则为奇数

temp_num = input('请输入一个数字:')

while not temp_num.isdigit():
    temp_num = input("您的输入有误,请重新输入一个数字:")

num = int(temp_num)
if(num % 2) == 0:
    print(f'{num}是一个偶数')
else:
    print(f'{num} 是一个奇数')

爱因斯坦曾出过这样一道有趣的数学题

  • 题目:

有一个长阶梯,若每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩

  • 分析

假设一共有y阶梯,则

  1. 条件1: y%2 = 1
  2. 条件2: y%5 = 4
  3. 条件3: y%6 = 5
  4. 条件4: y%7 = 0
  • 参考答案:
# 1000以下的所有可能的阶梯数

num = 7
con_flag = True

while con_flag and num < 1000:
    if (num%2 == 1 and num % 3 == 2 and num%5 == 4 and num%6 == 5): # 是否满足条件1-4
        if num > 1000: # 是否满足阶梯数小于1000
            con_flag = False
        else:
            print(num)
            num = num + 7
    else:
        num = num + 7

为什么math.sin(90)得到的结果不正确?

使用 math.sin(x),其中x参数不能直接传入数字,参数传入错误,结果肯定是错误的,比如:math.sin(90)=0.893996663600

怎么传参?其实x是以弧度作为参数传入的,调用 radians 方法就可以了,比如计算90度的正切值,可以这样传入

import math

print(math.sin(math.radians(90)))

assert 的作用是什么

assert通常称之为断言,Python的一个内置函数,是一种系统的方法,用来捕获错误,常用于产品还未发布之前,程序的处于开发和调试的时候,用于检查程序的内部状态是否与程序员预期的一样。

Assert不同于通常print调试信息打印,它的机制在于我们在编写程序的时候就会预计到将有可能出现什么错误,进行捕获,也就是说assert是捕获在编写代码时就预计到的可能会出现的错误假设,或者被其他程序员滥用接口的情况。

assert语句具有一个应该始终为true的条件或表达式。 如果条件为false,则断言暂停程序并给出AssertionError,具体语法如下:

# 格式1
assert <condition>

# 格式2
assert <condition>,<error message>
  • 格式1:有一个条件,如果条件不满足,程序将停止并给出AssertionError。
  • 格式2:有条件和可选的错误消息。 如果条件不满足,则assert将停止程序并提供AssertionError以及错误消息。

详细内容可以参考官方文档

快速交换三个变量的值

假设有 x = 1,y = 2,z = 3,则可以通过如下代码直接实现

x, y ,z = 1, 2, 3
print(x, y ,z) # 1 2 3

# 快速交互
x, y, z = z, x, y
print(x, y ,z) # 3 1 2

什么是成员资格运算符?

他是Python特有的一个东西,可以快速的判断某个成员是否存在与一个序列中,如果在序列中返回 True,否则返回 False。

list1 = [1, 2, 3, 4]

if 1 in list1:
    print('exist !')
else:
    print('not exist !')

详细内容,可以参考白月黑羽Python3教程 - 资格运算符

水仙花数

水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)

max_num = int(input('请输入最大范围'))

# 获取大于100,小于指定数的水仙花数
for num in range(100, max_num):
    sum = 0
    length = len(str(num))
    temp = num
    for i in range(length):
        sum += (temp % 10) ** length
        temp //= 10
    if sum == num:
        print(num)

break 和 continue 在循环中起到的作用

  1. break语句的作用是终止当前循环,跳出循环体。
  2. continue语句的作用是终止本轮循环并开始下一轮循环

详细内容,可以参考白月黑羽Python3教程 - 循环

列表可以存放何种类型的元素

我们说列表是一个容器,就像日常生活的抽屉一样,只要是物体都可以放,和实际的抽屉唯一不一样的是,他可没有空间限制哟,但是我的抽屉是有的

比如,我们可以放入我们学到任何类型的数据,就像下面这样:

# 定义列表包含整数,浮点数,字符串,列表,元组和字典
list1 = [90, 99.99, '白月黑羽',['python3.vip','byhy'],(1,2,3),{'name':'byhy','script':'Python3'}]
print(list1)

可以参考白月黑羽Python3教程 - 列表

列表增加元素有哪些方法?

方法有三种,分别为:

  1. append()
  2. extend()
  3. insert()

可以参考白月黑羽Python3教程 - 列表方法

append()和extend()的区别

  • append() 方法是将一个元素追加到一个列表的末尾
  • extend() 方法则是将参数作为一个列表去扩展列表的末尾,可以理解为两个列表的拼接

python3中的range函数返回的是列表吗?

注意,这里说的Python3里面的range函数,和Python2是不同的,返回的不是列表,是可迭代对象

在python3中,如果执行下面的语句

print(range(10))

得到结果是 range(0,10) ,而不是期望的[0,1,2,3,4,5,6,7,8,9]。但是如果换一种方式

print(list(range(10)))

得到的结果却是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。

那为什么会这样呢?其实在Python3中range()函数返回的对象很像一个列表,但是它确实不是一个列表,它只是在迭代的情况下返回指定索引的值,它并不会在内存中产生一个列表对象,官方解释说这样做是为了节约内存空间。通常我们称这种对象是可迭代的,或者是可迭代对象。

这里就要引入另外一个叫迭代器的概念,迭代器可以从一个可迭代对象中连续获取指定索引的值,直到索引结束。比如list()函数,所以在上面的例子中,我们可以用list()这个迭代器将range()函数返回的对象变成一个列表。

由此可以看出:range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型;list() 函数是对象迭代器,把对象转为一个列表,返回的变量类型为列表。

Python3中range的用法

开发程序时,我们经常需要 循环执行某段代码 n次

比如,我们要打印出 ‘python,我爱你’ 100次。

这时,我们可以使用for 循环 和 一个内置类型 range ,如下所示

# range里面的参数100 指定循环100次
# 其中 n 依次为 0,1,2,3,4... 直到 99
for n in range(100):  
    print(n)      
    print('python,我爱你')

注意:

和Python 2 不同, Python 3 中的range 并不是一个函数,不会返回一个数字列表。 Python 3 中的range 是一个 类

如果你想返回一个 从 0到99的数字列表, 可以这样写 : list(range(100))

列表推导式(列表解析)

我们经常需要这样处理一个列表:把一个列表里面的每个元素, 经过相同的处理 ,生成另一个列表。

比如:一个列表1,里面都是数字,我们需要生成一个新的列表B,依次存放列表A中每个元素的平方

怎么办?

当然可以用for循环处理,像这样

list1 = [1,2,3,4,5,6]
list2 = []
for num in list1:
    list2.append(num*num)

Python还有更方便的语法,可以这样写

list1 = [1,2,3,4,5,6]
list2 = [num**2 for num in list1]

这种写法,通常叫做 列表推导式

就是把一个列表里面的每个元素经过简单的处理生成另一个列表的操作。

其中 for 前面的部分,就是要对取出的元素进行的处理操作, 上面的例子是计算平方。

如果我们 得到的 list1 里面每个元素的 立方呢?

对了,就可以这样

list1 = [1,2,3,4,5,6]
list2 = [num**3 for num in list1]

局部变量与全局变量案例演示

a = 10

def setNum():
    a = 100

setNum()
print(a)

答案解析: a = 10; 这是一个变量作用域的问题,变量分为全局变量和局部变量。a=10是全局变量,而函数setNumber()里面的a=100是一个局部变量。局部变量的作用域就是在函数内部,函数执行完,局部变量也跟着函数一起被回收。

如果想要影响全局变量可以把函数的局部变量声明全局(global),可以改进如下,但建议最好不使用声明全局

a = 10

def setNum():
    global a
    a = 100

setNum()
print(a) # 100

中文字符编码简介

  • gb2312适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。
  • gbk标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
  • big5是一种中文繁体编码,主要在我国的台湾和香港地区使用。
  • ascii主要用于显示现代英语和其他西欧语言。

sys模块简介

sys是system的缩写,sys模块是python标准库中最常用的模块之一。通过它可以获取命令行参数,从而实现从程序外部向程序内部传递参数的功能,也可以获取程序路径和当前系统平台等信息。

什么叫文本字符串、二进制字符串和文本字符串

文本字符串 - 就是我们人类能看得懂的字符组成的一句话或者一段语句

二进制字符串 - 就是我们计算机能看得懂的字符组成的一句话或者一段语句,是有0和1构成的编码

字节字符串 - 也可以叫二进制字符串,是字节序列,它可以直接存储在硬盘。与字符串之间的映射关系通常称为编码与解码

常量字符串 - 指的是存放在静态存储区的字符串,这是一块比较特殊的存储区,里面存放的是常量,是不允许修改的,返回的是常量字符串的首地址。

Unicode字符串 - 首先需要了解unicode是什么?Unicode也叫统一码、万国码,是计算机科学领域里的一项业界标准,它为每种语言中的每个字符设定了统一并且唯一的二进制编码. Unicode字符串就是将普通字符串给标准化了,每个字符用用唯一的二进制进行编码后组成的字符串。

用Python实现冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

白月黑羽的参考代码如下:

print('=====白月黑羽的参考代码=====')
array = [1,6,7,2,9,4]
for i in range(len(array)-1,1,-1):
    for j in range(0,i):
        if array[j] > array[j+1]:
            array[j],array[j+1] = array[j+1],array[j]
print(array)

大小写转换

转换大小写 和其他语言一样,Python为string对象提供了转换大小写的方法:upper() 和 lower()。还不止这些,Python还为我们提供了首字母大写,其余小写的capitalize()方法,以及所有单词首字母大写,其余小写的title()方法。函数较简单,看下面的例子:

str1 = 'lEARN pYthon wITH BYHY'
print(str1.upper())
print(str1.lower())
print(str1.capitalize())
print(str1.title())

输出结果:

LEARN PYTHON WITH BYHY
learn python with byhy
Learn python with byhy
Learn Python With Byhy

判断大小写

Python提供了isupper(),islower(),istitle()方法用来判断字符串的大小写。注意的是:

  1. 没有提供 iscapitalize()方法,下面我们会自己实现,至于为什么Python没有为我们实现,就不得而知了。
  2. 如果对空字符串使用isupper(),islower(),istitle(),返回的结果都为False。
print('BYHY'.isupper()) # True
print('BYHY'.islower()) # False

print('Learn Python With Byhy'.istitle()) # True
# print('Learn Python With Byhy'.iscapitalize()) # 错误,不存在iscapitalize()方法