序章:
PyPi:拥有许多第三方模块
功能:数学运算,人工智能,神经网络框架,自动化部署
课程内容:语法知识,案例开发
环境搭建和课程介绍:
- 在https://www.python.org/downloads/官网下载python最新版(挂梯子),安装时点击自动配置环境文件,然后傻瓜式安装
- 鱼c论坛配套资源
- 在交互式界面输入import this (一个官方彩蛋)
用python设计第一个游戏
- 编辑模式切换:在idle点击file然后new file 新建文件(此处我使用pycharm)
- temp = input("不妨猜一下小甲鱼心里想的是哪个数字?")
- guess = int(temp)
-
- if guess==8:
- print("猜对,蛔虫")
- print("猜对无奖励")
- else:
- print("猜错")
- print("游戏结束")
- 几点问题:
- 符号是否为英文(为了更方便的分辨出中英文符号可以修改字体为consolas)
- 请检查缩进是否正确(非常关键,python代码规范为pep8指导手册)
- 函数拼写问题
- 内置函数:input ,print(”输出内容“)(输入dir(builtins)可以看到所有内置函数)
变量和字符串
- 变量(variable)
- x = 3#变量赋值
- print(x)#输出变量
- 变量名的起名规则:
- 1)命名的规范性
-
- 变量名可以包括字母、数字、下划线,但是数字不能做为开头。例如:name1是合法变量名,而1name就不可以。
- 系统关键字不能做变量名使用
- 除了下划线之个,其它符号不能做为变量名使用
- Python的变量名是除分大小写的
- 2)驼峰命名法
-
- 大驼峰:每一个单词的首字母都大写 FirstName LastName
- 小驼峰:第一个单词以小写字母开始,后续单词的首字母大写 firstName lastName
- 不同变量的值可以传递
- 字符串(string)
- Single quotes:使用单引号将文本包含
print('i love china')
- Double quotes:使用一对双引号将文本包含
print("i love china")
- Triple quotes:用来解释class,function,modules的定义(Triple quotes里的语句会执行。#是注释不会执行#后面的语句)。三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。三个连续的单引号或者双引号
- #123
- '''123'''
- 三种引号作用:为了避免文本里面的不可避免的单引号以及双引号
- 也可以在引号前加转义字符”\“:\n(换行),”\“也可加在代码末尾表示代码未结束。
- 字符串相加会拼接
- "520"+"1314"
- 5201314
- print("我每天爱你3000遍!\\n"*3000)
讲解代码
- temp = input("你是谁?")
- 你是谁?煎饼狗子
- > print(temp)
- 煎饼狗子
- >
-
if else 语句中的比较运算符
无标题
改进小游戏
- temp = input("不妨猜一下小甲鱼心里想的是哪个数字?")
- guess = int(temp)
-
- if guess==8:
- print("猜对,蛔虫")
- print("猜对无奖励")
- else:
- if guess < 8:
- print("小啦")
- else:
- print("大啦")
-
- print("游戏结束")
- #python通过缩进将不同层级的语句进行划分
- #else里面进行了嵌套
-
while条件:
如果条件为真执行while里的语句
- count = 3
- while count > 0:
- temp = input("不妨猜一下小甲鱼心里想的是哪个数字?")
- guess = int(temp)
- if guess==8:
- print("猜对,蛔虫")
- print("猜对无奖励")
- else:
- if guess < 8:
- print("小啦")
- else:
- print("大啦")
- count = count - 1
- print("游戏结束")
-
break语句:
执行到break语句会直接跳出循环
-
import+模块名导入
- import random
- random.randint(1,10)#1-10取随机数
- import random
- answer = random.randrange(1,10)
- count = 3
- while count > 0:
- temp = input("不妨猜一下小甲鱼心里想的是哪个数字?")
- guess = int(temp)
-
- if guess==answer:
- print("猜对,蛔虫")
- print("猜对无奖励")
- else:
- if guess < answer:
- print("小啦")
- else:
- print("大啦")
- count = count - 1
-
- print("游戏结束")
random.getstate()#获取随机数种子加工后的随机数生成器的内部状态
random.setstate()#可以将上一步保存的随机数状态重现,导致随机数和上次一样
数字类型
- 整数(integer):python的整数长度是不受限制 的
- 6/2
- 3.0
- 浮点数(float):不是百分之百精确
- 0.1+0.2
- 0.30000000004
-
通过decimal模块使浮点数精确
- import decimal
- a = decimal.Decimal('0.1')
- b = decimal.Decimal('0.2')
- print(a+b)
- 0.3
- 复数(complex):
- 1 + 2j
- (1+2j)
- x = 1 + 2j
- x.real#获取实部
- 1.0
- x.imag#获取虚部
- 2.0
-
//(取比目标结果小的最大整数):3/2=1,-3/2=2
abs(x) x的绝对值
int(x) 将x转化成整型
float(x) 将x转化为浮点型
complex(re,im) 返回一个复数 re为实部,im为虚部
c.conjugate() 返回c的共轭复数
divmod(x,y) 返回(x//y,x%y)
pow(x,y) 计算x的y次方
x**y 计算x的y次方
布尔类型
-
bool()内置函数直接给出ture或者false
bool(False)为假
bool(’False‘)为真
-
定义为False的对象:none,false
-
值为0的数字类型:0,0.0,0j,Decimal(0),Fraction(0,1)
-
空的序列和集合:‘’,(),[],{},set(),range(0)
-
逻辑运算符:
- and:左右都为同时true,结果为true
- or:左右有一个为true,结果为true
- not:如果操作数为true结果为false
短路逻辑和运算符优先级
- 短路逻辑:从左到右,当第一个操作数的值无法确定逻辑运算结果时,才对第二个数求值
- 运算符优先级:
了不起的分支循环
-
分支语句:
- if语句:判断一个条件,若成立就执行代码块或某条语句
- if else:判断一个条件,若成立就执行代码块或某条语句,若不成立就执行另一个代码块
- if elif….. elif……:分别判断
- if elif….. elif……else…..:表示上面的如果都不成立则执行else里的语句
- 条件成立时的语句 if 判断条件 else 条件不成立时的语句
-
循环结构:
-
while循环:while 条件
- 语句
-
for循环
-
continue:只会跳出本轮循环,如条件成立还会执行下一轮循环
-
else:当循环条件不再为真的时候,else语句才被执行。当使用break语句跳出循环,循环外的else语句不会执行
-
循环嵌套:break和continue只能作用于一层循环体
-
for 变量 in 可迭代对象 ststament(s)
- >>> for each in "fishc":#整型不能迭代
- ... print(each)
- ...
- f
- i
- s
- h
- c
-
range():生成一个数字序列
range(stop):生成0-stop-1的整数数列
range(start,stop):生成start-stop-1
range(start,stop,step):生成start-stop-1,step为跨度
- >>> for n in range(2,10):
- ... for x in range(2,n):
- ... if n % x == 0:
- ... print(n,"=",x,'*',n//x)
- ... break
- ... else:
- ... print(n,"是一个素数")
- ...
- 2 是一个素数
- 3 是一个素数
- 4 = 2 * 2
- 5 是一个素数
- 6 = 2 * 3
- 7 是一个素数
- 8 = 2 * 4
- 9 = 3 * 3
-
列表:列表可变,字符串不可变
-
创建列表:用中括号将所有元素包裹起来,不同元素用逗号分隔
rhyme = [1,2,3,4,“上山打老虎”]
-
列表切片:将单个索引值改成范围
rhyme[0:3]#打印前三个元素
rhyme[:3]#打印前三个元素
rhyme[3:]#从下标为3的元素开始打印
rhyme[:]#打印所有元素
rhyme[0,6,2]#以跨度为2打印
-
- appen():在列表末尾添加
- >>> s = [1,2,3,4,5]
- >>> s[len(s):] = [6]
- >>> s
- [1, 2, 3, 4, 5, 6]
- extend():可添加可迭代对象heros.extend([“钢铁侠”,”黑寡妇”,”绿巨人”])
- insert(a,b):第一个参数指定位置,第二个指定元素
- remove():删除指定元素,如果列表中存在多个匹配到的元素,只会删除第一个,如果元素不存在则报错
- pop():参数为元素下标
- clear():清空列表
- 直接替换元素
- [1, 2, 3, 4, 5, 6]
- >>> hero = [0,1,2,3,5,5,6]#也可使用切片批量替换
- >>> hero[4] = 4
- >>> hero
- [0, 1, 2, 3, 4, 5, 6]
-
sort():从小到大排序(有两个参数,key表示指定的排序方式,reverse表示排数结果是否反转,sort(reverse = true))
reverse():原地反转列表元素
-
count():查找元素,例如查找列表里面有多少个3
-
index(x , star, end):查找元素下标
-
copy():拷贝列表
-
列表的加法和乘法
- 加法
- >>> s = [1, 2, 3]
- >>> t = [4, 5, 6]
- >>> s + t
- [1, 2, 3, 4, 5, 6]
- 乘法
- >>> s * 3
- [1, 2, 3, 1, 2, 3, 1, 2, 3]嵌套列表(二维列表):
-
嵌套列表(二维数组)
- >>> matrix = [[1, 2, 3],[4, 5, 6]]
- >>> matrix
- [[1, 2, 3], [4, 5, 6]]
- 嵌套循环
- >>> for i in matrix:
- ... for each in i:
- ... print(each)
- ...
- 1
- 2
- 3
- 4
- 5
- 6
- 两个索引值(类似二维数组)
- >>> matrix[1][1]
- 5
- is判断两个变量是否指向同一个对象
- >>> x = "fishc"
- >>> y = "fishc"
- >>> x is y
- True
- >>> x= [1, 2, 3]
- >>> y = [1, 2, 3]
- >>> x is y
- False
- 列表的拷贝
- 浅拷贝:通过调用copy()方法或切片拷贝
- >>> x = [1,2,3]
- >>> y = x.copy()
- >>> y
- [1, 2, 3]
-
- >>> x = [1,2,3,4]
- >>> y = x[:]
- >>> y
- [1, 2, 3, 4]
浅拷贝只拷贝外层对象,若包含嵌套对象(类似二维数组)则只拷贝其引用
- >>> x = [[1,2,3],[4,5,6],[7,8,9]]
- >>> y = x[:]
- >>> y
- [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- >>> x[1][1] = 9
- >>> x
- [[1, 2, 3], [4, 9, 6], [7, 8, 9]]
- >>> y
- [[1, 2, 3], [4, 9, 6], [7, 8, 9]]
- 深拷贝
- >>> import copy
- >>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- >>> y = copy.copy(x)
- >>> x[1][1] = 0
- >>> y
- [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
- >>> y = copy.deepcopy(x)
- >>> x[1][1] = 9
- >>> y
- [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
- 列表推导式:[expression for target in iterable]
- >>> a = [i for i in range(10)]
- >>> a
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> y = [c * 2 for c in "fishc"]
- >>> y
- ['ff', 'ii', 'ss', 'hh', 'cc']
- >>> code = [ord(c) for c in "fishc"]#ord()内置函数,将字符转化为编码
- >>> code
- [102, 105, 115, 104, 99]
-
- >>> x = [[1, 2, 3], [4, 9, 6], [7, 8, 9]]
- >>> diag = [x[i][i] for i in range(len(x))]
- >>> diag
- [1, 9, 9]#获取对角线元素
-
- >>> s = [[0] * 3 for i in range(3)]
- >>> s
- [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[expression for target in iterable if condition]#先执行for语句,再执行if语句,最后执行表达式
- >>> even = [i for i in range(10) if i % 2 == 0]
- >>> even
- [0, 2, 4, 6, 8]
[expression for target1 in iterable1
- for target2 in iterable2
- for target3 in iterable3
…………………………………………………..]
- >>> [x + y for x in"FISHC" for y in "fishc"]
- ['Ff', 'Fi', 'Fs', 'Fh', 'Fc', 'If', 'Ii', 'Is', 'Ih', 'Ic', 'Sf', 'Si', 'Ss', 'Sh', 'Sc', 'Hf', 'Hi', 'Hs', 'Hh', 'Hc', 'Cf', 'Ci',
- 'Cs', 'Ch', 'Cc']
[expression for target1 in iterable1 if condition1
- for target2 in iterable2 if condition2
- for target3 in iterable3 if condition3
…………………………………………………..]
元组:不可变,支持切片操作
- >>> rhyme = (1,2,3,4,5,"adawd")
- >>> rhyme
- (1, 2, 3, 4, 5, 'adawd')
- 支持count()和index()方法
- 列表推导式也可以用列表推导式生成一个新的元组
- 在不会影响理解的条件下可以省略圆括号(最好不要)
- 生成一个元素的元组 😡 = (123, )
- 打包:生成一个元组;解包:将元组的元素一次性赋值给其他变量
- >>> t = (1,2,3)
- >>> x,y,z = t#也可以将字符串解包
- >>> x
- 1
- >>> y
- 2
- >>> z
- 3
- 若元组中的元素是列表,则可以改变列表的值
字符串#像元组一样不可变的序列
- 判断是否为回文数
- >>> x = "12321"
- >>> "是回文数" if x == x[::-1] else "不是回文数"
- '是回文数'
- 字符串的一些方法:#生成新的字符串
-
capitalize():大字符串首字母大写,其他字母小写
-
casefold():返回一个所有字母都是小写的字符串 #可以处理其他语言
-
title():字符串中每个单词首字母变大写,其他字母为小写
-
swapcase():大小写反转
-
upper():所有字母变大写
-
lower():所有字母小写 #只能处理英语
-
左中右对齐:center(width,filllchar‘’):width指定字符串宽度,fillchar指代填充字符
- ljust(width,filllchar‘’):左对齐
- rjust(width,filllchar‘’):右对齐
- zfill(width):用0填充左侧
- >>> x = "有内鬼,停止交易"
- >>> x.center(5)
- '有内鬼,停止交易'
- >>> x.center(15)
- ' 有内鬼,停止交易 '
- '0000000有内鬼,停止交易'
-
查找:count(sub[,start[,end]]):查找sub参数指定的子字符串在字符串中出现的次数
- find(sub[,start[,end]]):定为sub参数指定的子字符串在字符串中的下标值(从左往右)
- rfind(sub[,start[,end]]):(从右往左)(找不到的话返回-1)
index(sub[,start[,end]]):找不到的话返回异常
rindex(sub[,start[,end]]):
- >>> x = "上海自来水来自海上"
- >>> x.count("海")
- 2
- >>> x.count("海",0,5)
- 1
- >>> x.find("海")
- 1
- >>> x.rfind("海")
- 7
-
替换:expandtabs([tabsize=8]):使用空格替代制表符,然后返回一个新的字符串 replace(old,new,count=-1):将old参数指定的子字符串替换为new参数指定的字符串,count指替换次数(默认为-1,全部)
translate(table):返回table参数返回的新字符串(str.maketrans(x[,y[,z]])获取table表格)
- >>> code = """
- ... print("i")
- ... print("i")"""
- >>> newcode = code.expandtabs(4)
- >>> print(newcode)
- print("i")
- print("i")
- >>> table = str.maketrans("abcdefg","1234567")
- >>> "dsvsdvsg" .translate(table)
- '4svs4vs7'
22:05
- 判断:startswith(prefix[,start[,end]]):判断参数指定 的子字符串是否出现在字符串的起始位置
endswith(suffix[,start[,end]]):指定的子字符串是否出现在结束位置(支持以元组形式传入多个字符串匹配)
istitle():检测单词是否都已大写开头,其余为小写
isupper():是否所有字母都为大写
islower():小写
isalpha():是否只有字母(空格也不算字母)
isspace():检测是否为空白字符串(空格,制表符,\n)
isprintable():字符串中是否都可以打印
isdecimal,isdigit,isnumeric():检测是否为数字,检测的程度不同
isalnum():
isidentifier():检测是否为合法标识符
- 截取:lstrip:左侧不要留白
rstrip:
stricp:两侧不留白
removeprefix(prefix):删除指定的前缀
removesuffix(suffix):删除指定的后缀
- 拆分和拼接:partition(sep):将字符串以参数指定的分隔符分割,返回三元组
rpartition(sep):从右到左
split(sep=none,maxsplit=-1):第一个参数指定分隔符,第二个参数指定分割次数
rsplit:从右到左
splitlines:按行分割,以列表返回
join(iterable):字符串拼接
- >>> ".".join(["www","ilove","com"])
- 'www.ilove.com'
-
格式化字符串:format():
- >>> "1+2={},2的平方是{},3的立方是{}".format(1+2,2*2,3*3*3)
- '1+2=3,2的平方是4,3的立方是27'
序列:列表,元组,字符串
- 可以作用于序列的运算符:+,-,*,/
- id:返回一个指定对象的唯一标志的整数值
- is和is not(同一性运算符):判断id是否相同
- in和in not:判断某元素是否包含在里面
- del:删除一个或多个指定对象
- list():转换成列表
- tuple():可迭代对象转换为元组
- str():转换才字符串
- min()和max(x,default = ”啥都没有“):返回最大或最小值
- len()和sum():len()参数最大值为2*63-1
- sorted()和reversed():排序,小到大,生成一个新列表,接受任何可迭代参数
- >>> t = ["fishc","apple","book","banana"]
- >>> sorted(t,key = len)
- ['book', 'fishc', 'apple', 'banana']
-
- >>> s = [1,2,5,8,0]
- >>> reversed(s)
- <list_reverseiterator object at 0x00000191207A12D0>
- >>> list(reversed(s))
- [0, 8, 5, 2, 1]
- all()和any():all判断可迭代对象中是否所有元素值为真,any为是否存在
- enumerate(s,x):返回元组,x表示从x开始形成二元组
- >>> s = ["sp","su","fall","winter"]
- >>> enumerate(s)
- <enumerate object at 0x00000191207BCD00>
- >>> list(enumerate(s))
- [(0, 'sp'), (1, 'su'), (2, 'fall'), (3, 'winter')]
- zip():
- >>> x = [1,2,3]
- >>> y = [4,5,6]
- >>> z = zip(x,y)
- >>> list(z)
- [(1, 4), (2, 5), (3, 6)]
-
- >>> import itertools
- >>> a = [2,3,5,4,8]
- >>> z = itertools.zip_longest(x,y,a)
- >>> list(z)
- [(1, 4, 2), (2, 5, 3), (3, 6, 5), (None, None, 4), (None, None, 8)]
- map(ord,”“):提供计算方法,传入第一个参数
- >>> mapped = map(ord,"fishc")#ord方法为求参数编码
- >>> list(mapped)
- [102, 105, 115, 104, 99]
- filter():类似于map函数,返回计算结果为真的迭代器
- 可迭代对象可以多次使用,迭代器使用一次
- iter():迭代对象换为迭代器
- next():逐个将迭代器中元素提取出去
字典
x = {”吕布“:”口口布“,”关羽“:”关习习“}
x[“吕布”]
‘口口布’
- 直接使用大括号创建字典
- 使用dict(吕布 = ”口口布“)函数
- dict([(,),(,),(,)])
- dict({“吕布”:”口口布“})
- dict(zip([”吕布“],[”口口布“]))
- 增:fromkeys(iterable,【,values】)
- >>> d = dict.fromkeys("fish",250)
- >>> d
- {'f': 250, 'i': 250, 's': 250, 'h': 250}
- >>> d.pop("f")
- 250
- >>> d
- {'i': 250, 's': 250, 'h': 250}
- 删:pop()
popitem():删除最后一个键值对
del d[“i”]
d.clear()
- 改:update([other]):
- >>> d = dict.fromkeys("fishc")
- >>> d
- {'f': None, 'i': None, 's': None, 'h': None, 'c': None}
- >>> d["s"] = 115
- >>> d
- {'f': None, 'i': None, 's': 115, 'h': None, 'c': None}
- >>> d.update({"i":105,"h":104})
- >>> d
- {'f': None, 'i': 105, 's': 115, 'h': 104, 'c': None}
- >>> d.get("C","这里没有")
- '这里没有'
- 查:get(key[,default]):default指定找不到时返回的值
items():获取键值对(都是视图对象,可以随着字典改变而改变) keys():获取键 values():获取值
- copy():浅拷贝
- 嵌套:字典可以嵌套(嵌套字典,列表等)
- 字典推导式:
- >>> d = {"f":70,"i":105,"c":115}
- >>> b = {v:k for k,v in d.items()}
- >>> b
- {70: 'f', 105: 'i', 115: 'c'}