xe5xb0x8fxe7x86x8a

风变编程笔记(一)-Python基础语法

关键字:print()  type()  input()  append()  pop()  range()  numpy  math.ceil()  index()  @classmethod  @staticmethod  self  __init__()  __str__()  split()  join()  random  dir()  csv  time  os  smtplib  email  myqr

第0关  print()函数与变量

1. print()函数
print()函数:告诉计算机,把括号的内容显示在屏幕上

# 不带引号
print(1+1)  # 让计算机读懂括号里的内容,打印最终的结果
# 》》2

# 带引号
print('hello world!')  # 让计算机无需理解,原样复述引号中的内容
# 》》hello world!

# 带双引号
print("Let's play")  # 让计算机无需理解,原样复述引号中的内容,可以输出内容中的单引号
# 》》Let's play

# 三引号
print(''' 
    へ     /|
  /\7    ∠_/
  / │   / /
 │ Z _,< /   /`ヽ
 │     ヽ   /  〉
  Y     `  /  /
 イ● 、 ●  ⊂⊃〈  /
 ()  へ    | \〈
  >ー 、_  ィ  │ //
  / へ   / ノ<| \\
  ヽ_ノ  (_/  │//''')  # 原样打印,实现换行
# 》》 へ     /|
#   /\7    ∠_/
#   / │   / /
#  │ Z _,< /   /`ヽ
#  │     ヽ   /  〉
#   Y     `  /  /
#  イ● 、 ●  ⊂⊃〈  /
#  ()  へ    | \〈
#   >ー 、_  ィ  │ //
#   / へ   / ノ<| \\
#   ヽ_ノ  (_/  │//

2. 转义字符

3. 变量

变量赋值用=表示,不要跟==搞混

第1关  数据类型与转换

1. 数据类型
Python里,最常用的数据类型有三种——字符串(str)、整数(int)和浮点数(float)
· 字符串英文string,简写str,有层名为【引号】的皮,只要是被【单/双/三引号】这层皮括起来的内容,不论那个内容是中文、英文、数字甚至火星文。只要是被括起来的,就表示是字符串类型
· 整数英文为integer,简写做int,Python世界的整数其实和现实世界数学中定义的一样:是正整数、负整数和零的统称,是没有小数点的数字
· 浮点数的英文名是float,是带小数点的数字。与【整数运算结果永远精确】的特点不同,计算机里浮点数的运算是不精确的,因为计算浮点数时会先讲数字转换成二进制数,通过二进制法则运算后,再通过复杂的计算公式,将二进制结果转成十进制小数
2. 算术运算符

print(2+1)  # 加法
# 》》3
print(1-2)  # 减法
# 》》-1
print(1*2)  # 乘法
# 》》 2
print(1/2)  # 除法
# 》》0.5
print(5 % 2)  # 取模(做除法返回余数)
# 》》1
print(2**3)  # 幂(这里是2的3次方)
# 》》8
print(11//2)  # 取整除(做除法返回商的整数部分)
# 》》5
3. 数据类型的查询——type()函数
print(type('桂纶镁'))
# 》》<class 'str'>
print(type(1))
# 》》<class 'int'>
print(type(1.55))
# 》》<class 'float'>

4. 数据转换

第2关  条件判断与条件嵌套

1. 条件判断


2. if嵌套

当然,elif也是可以放进嵌套里的

第3关  input()函数

name = input('请输入你的名字:')
# 将input()函数的执行结果,在终端输入的数据,赋值给变量name

input()函数的输入值,永远会被【强制性】地转换为【字符串】类型(Python3固定规则)

第4关  列表和字典

1. 列表(list)

一些列表的相关操作↓

s = ['柯佳嬿', '许光汉', '施柏宇', '颜毓麟', '林鹤轩', '张翰']

print(len(s))  # 打印列表s的长度
# 》》6
print(type(s))  # 打印列表s的类型
# 》》<class 'list'>
print(s[3])  # 打印列表s里面的第3个元素
# 》》颜毓麟
print(s[-3])  # 打印列表s里面的倒数第3个元素
# 》》颜毓麟

list1 = [91, 95, 97, 99]
list2 = [92, 93, 96, 98]

# 列表的合并
list3 = list1+list2  # 第一种方法:+直接拼接
print(list3)
# 》》[91, 95, 97, 99, 92, 93, 96, 98]
list1.extend(list2)  # 第二种方法:extend()方法
print(list1)
# 》》[91, 95, 97, 99, 92, 93, 96, 98]

# 列表的排序
a = [91, 95, 97, 99, 92, 93, 96, 98]
a.sort()  # 列表从小到大排序
print(a)
# 》》[91, 92, 93, 95, 96, 97, 98, 99]
b = [91, 95, 97, 99, 92, 93, 96, 98]
b.sort(reverse=True)  # 列表从大到小排序
print(b)
# 》》[99, 98, 97, 96, 95, 93, 92, 91]
c = [91, 95, 97, 99, 92, 93, 96, 98]
c.reverse()  # 列表反向排序
print(c)
# 》》[98, 96, 93, 92, 99, 97, 95, 91]

用冒号来截取列表元素的操作叫作切片(slice),切片可以单拿出来说很长的篇幅,网上搜到一篇讲的很清楚的:彻底搞懂Python切片操作
给列表增加元素:列表名.append()
给列表删除元素:del 列表名[元素的索引]
pop()函数,用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值↓

students = ['小明', '小红', '小刚']
for i in range(3):
    student1 = students.pop(0)  # 运用pop()函数,同时完成提取和删除。
    students.append(student1)  # 将移除的student1安排到最后一个座位。
    print(students)

# 》》》 ['小红', '小刚', '小明']
# 》》》 ['小刚', '小明', '小红']
# 》》》 ['小明', '小红', '小刚']

2. 字典(dict)

字典中的键具备唯一性,而值可重复
从字典中提取元素:字典名[字典的键]
字典新增键值对:字典名[键] = 值

scores = {'小明': 95, '小红': 90, '小刚': 90}
print(scores['小明'])  # 从字典中提取元素
# 》》95
scores['小红'] = 88  # 改变字典中的值
print(scores['小红'])
# 》》88
scores['小北'] = 98  # 给字典新增键和值
print(scores)
# 》》{'小明': 95, '小红': 88, '小刚': 90, '小北': 98}

字典删除键值对:del 字典名[键]

3. 列表和字典的不同点
列表中的元素是有自己明确的“位置”的,所以即使看似相同的元素,只要在列表所处的位置不同,它们就是两个不同的列表。而字典相比起来就显得随和很多,调动顺序也不影响。因为列表中的数据是有序排列的,而字典中的数据是随机排列的。

4. 列表和字典的嵌套

students = {
    '第一组':['小明','小红','小刚','小美'],
    '第二组':['小强','小兰','小伟','小芳']
    }
print(students['第一组'][3])
#取出'第一组'对应列表偏移量为3的元素,即'小美'

scores = [
    {'小明':95,'小红':90,'小刚':100,'小美':85},
    {'小强':99,'小兰':89,'小伟':93,'小芳':88}
    ]
print(scores[1]['小强'])
#先定位到列表偏移量为1的元素,即第二个字典,再取出字典里键为'小强'对应的值,即99。

5. 元祖(tuple)
元组的写法是将数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改

list2 = [('A', 'B'), ('C', 'D'), ('E', 'F')]
print(list2[1][1])
# 》》 D
# 从代码里可看出:1.元组内数据的提取也是用偏移量;2.元组也支持互相嵌套。

以上几种关于收纳的数据类型,最常用的还是列表,而对偏移量切片的使用是写算法非常重要的技能  

第5关  for循环和while循环

1. for...in...循环语句

2. range()函数

3. while循环

4. 两种循环对比

第6关  布尔值和四种语句

布尔运算的三种方式:
第一种计算:两个数值做比较
一共有6种比较方式:==、!=、>、<、>=、<= 

print(3 == 3.0)
# 》》True
print('a' != 'a')
# 》》False
print(3 > 5)
# 》》False
print(3 < 5)
# 》》True
print(100 >= 101)
# 》》False
print(100 <= 101)
# 》》True

第二种计算:直接用数值做运算

第三种计算:布尔值之间的运算
一共有5种计算方式:and、or、not、in、not in 

# and计算和or计算
a = 1
b = -1
print(a == 1 and b == 1)  # and要求条件都满足才为True
# 》》False
print(a == 1 or b == 1)  # or只要求其中一个条件满足就为True
# 》》True

# not计算
a = True
print(not a)  # not计算会反转真假
# 》》False

# in计算和not in计算
a = [1, 2, 3, 4, 5]
print(0 in a)  # in用来判断一个元素是否在一堆数据之中
# 》》False
print(1 in a)
# 》》True
print(0 not in a)  # not in用来判断一个元素是否不在一堆数据之中
# 》》True
print(1 not in a)
# 》》False

 

第7关  项目实操:PK小游戏(1)

import time   #调用time模块
time.sleep(secs)   
#使用time模块下面的sleep()函数,括号里填的是间隔的秒数(seconds,简称secs)
#time.sleep(1.5)就表示停留1.5秒再运行后续代码
import random  # 调用random模块
a = random.randint(1, 100)
# 随机生成1-100范围内(含1和100)的一个整数,并赋值给变量a
print(a)

print(random.choice([5, 7, 9, 11, 13, 15]))  # 在给定列表中随机选择

取英文变量名推荐网站:CODELF
三种格式化字符串方法↓

a = 5
b = 7.85
print(str(a)+'+'+str(b)+'='+str(a+b))  # 第一种:+拼接字符串和变量
# 》》5+7.85=12.85
print('%d+%s=%.2f' % (a, b, a+b))  # 第二种:格式符+类型码 %.2f的意思是格式化字符串为浮点型并保留两位小数
# 》》5+7.85=12.85 
print('{}+{}={}'.format(a, b, a+b))  # 第三种:format()函数
# 》》5+7.85=12.85

第8关  编程思维:如何解决问题

拓展程序库numpy的简单用法↓

import numpy as np  # 导入 numpy库,下面出现的 np 即 numpy库

a = [91, 95, 97, 99, 92, 93, 96, 98]

average = np.mean(a)  # 求平均数,average是numpy.float64类型
print(average)
# 》》95.125

b = np.array(a)  # 将列表a转换为numpy.ndarray类型
print('小于平均数的有:{}' .format(b[b < average]))
# 》》[91 95 92 93]

c = b.tolist()  # 将数组b转换回列表
print(type(c))
# 》》<class 'list'>

第9关  函数

函数是组织好的、可以重复使用的、用来实现单一功能的代码
1. 定义和调用函数 

# 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合
# 2. 不可与内置函数重名(内置函数不需要定义即可直接使用)
def math(x):
    # 参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
    # 规范:括号是英文括号,后面的冒号不能丢
    y = x ** 2 + x
# 函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格
    return y
# return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略

print(math(5))  # 调用math()函数

2. 参数类型
以最熟悉的print()函数为例↓

print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)

可以看到第一个参数objects带了*号,为不定长参数——这也是为什么print()函数可以传递任意数量的参数。其余四个为默认参数,我们可以通过修改默认值来改变参数。

print('www', 'pypypy', 'cn')  # objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
# 》》www pypypy cn
print('www', 'pypypy', 'cn', sep=".")  # sep -- 用来间隔多个对象,默认值是一个空格。
# 》》www.pypypy.cn
print('hello', end='~~~~~~')  # end -- 用来设定以什么结尾。默认值是换行符 \n,可以换成其他字符串。
print('world')
# 》》hello~~~~~~world

print()函数的参数file和flush说起来篇幅比较长,单写了篇关于print()、sys.stdout、sys.stderr的一些理解
3. 返回多个值

def a():
    return 1, 2, 3

b = a()  # 变量b接收函数a的返回值
print(b)  # 打印返回值
# 》》(1, 2, 3)
print(type(b))  # 打印返回值的类型
# 》》<class 'tuple'>

也可以同时定义多个变量,来接收元组中的多个元素

def a():
    return 1, 2, 3

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

4. 变量作用域
· 一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】
· 在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】
如果想将局部变量声明为全局变量,就要用到global语句

tfc = 1000

def tvc():
    global tvc  # global语句一般写在函数体的第一行,它会告诉Python,“我希望tvc是个全局变量,所以请不要用这个名字创建一个局部变量”
    vc = 200
    x = 10
    tvc = vc * x

def tc():
    print(tfc+tvc)  # tc()函数内部现在可以直接使用声明后的全局变量tvc

tvc()
tc()
# 》》3000

5. 函数的嵌套

tfc = 1000

def tvc():
    vc = 200
    x = 10
    return vc * x

def tc():
    print(tfc+tvc())  # 在tc()函数中调用了tvc()函数

tc()
# 》》3000

6. 递归

def digui(num):
    if (num == 1):
        return 1
    return num * digui(num-1)

x = digui(5)
print(x)
# 》》120

 

第10关  项目实操:PK小游戏(2)

1. 向上取整

import math

# 人力计算
def estimated_number(size, time):
    number = size * 80 / time
    print(number)
    # 》》1.3333333333333333
    print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %
          (size, time, math.ceil(number)))  # 通过ceil()函数向上取整
    # 》》项目大小为1.0个标准项目,如果需要在60.0个工时完成,则需要人力数量为:2人

estimated_number(1, 60)

如果不用ceil()函数,这个人力计算向上取整也可以通过判断余数不为零就加一的方法实现
2. index()函数
index()函数用于找出列表中某个元素第一次出现的索引位置

import random

punches = ['石头', '剪刀', '']

# 猜拳游戏
def punches_game(user_choice):
    computer_choice = random.choice(punches)
    if user_choice == computer_choice:
        print('平局')
    # 电脑的选择有3种,索引位置分别是:0石头、1剪刀、2布。
    # 假设在电脑索引位置上减1,对应:-1布,0石头,1剪刀,皆胜。
    elif user_choice == punches[punches.index(computer_choice)-1]:
        print('你赢了')
    else:
        print('你输了')

punches_game(user_choice='')

第11关  编程思维:如何debug

多行注释有两种快捷操作:1) 在需要注释的多行代码块前后加一组三引号''' 2) 选中代码后使用快捷键操作:Mac为cmd+/
异常处理:

# 方式1:
try:
    x = input('请你输入被除数:')
    y = input('请你输入除数:')
    z = float(x)/float(y)
    print(x, '/', y, '= %.2f' % z, sep='')
except ZeroDivisionError:  # 当除数为0时,跳出提示,重新输入。
    print('0是不能做除数的!')
except ValueError:  # 当除数或被除数中有一个无法转换成浮点数时,跳出提示,重新输入。
    print('除数和被除数都应该是整值或浮点数!')

# 方式2:将两个(或多个)异常放在一起,只要触发其中一个,就执行所包含的代码。
# except(ZeroDivisionError,ValueError):
#     print('你的输入有误,请重新输入!')

# 方式3:常规错误的基类,假设不想提供很精细的提示,可以用这个语句响应常规错误。
# except Exception: #换成BaseException也可以
#     print('你的输入有误,请重新输入!')

关于Python的所有报错类型,一般可以在这里查阅:https://www.runoob.com/python/python-exceptions.html
异常层次结构需到官网查看https://docs.python.org/zh-cn/3/library/exceptions.html#exception-hierarchy

第12关  类与对象1

Python中的对象等于类(class)和实例(instance)的集合:即类可以看作是对象,实例也可以看作是对象

1. 类的创建和调用
Python里的每个类都有自己独特的属性(attribute)和方法(method),是这个类的所有实例都共享的。换言之,每个实例都可以调用类中所有的属性和方法。 


posted on 2020-02-20 02:17  牡蛎君  阅读(26177)  评论(0编辑  收藏  举报

导航