聪明办法学python
一、输入输出
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量
-
print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:函数依次打印每个字符串,遇到逗号“,”会输出一个空格print('The quick brown fox', 'jumps over', 'the lazy dog')
输出:
The quick brown fox jumps over the lazy dog
print("111","222",sep="*")输出多内容时,默认以空格分割,sep可改变分割符号
输出可以做加法与乘法;
print("""
-----
0----
""") #一次输出多行使用 \可以保持美观
print(稍微就\
和独爱忘记哦\
ajoiwjdio)
输出结果:稍微就和独爱忘记哦ajoiwjdio"\""--双引号
"\\"--反斜线
"\n"--换行
"\t"--跳格符
-
input 输入
注意!!!输入返回的类型是字符串
input()
一行输入多值
a,b = input().split(",")
直接输入多值,分隔符默认是空格,可以更改使用split。 -
注释
单行注释:使用#开头书写
多行注释:使用"""或者'''把注解包裹起来
二、数据类型
-
整数
有正负之分
-
浮点数
对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是
1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。 -
字符串
字符串是以单引号
'或双引号"括起来的任意文本。如果字符串内部有很多换行,用
\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容,命令行:>>> print('''line1
... line2
... line3''')
line1
line2
line3如果写成程序并存为
.py文件,就是:print('''line1
line2
line3''')如果字符串里面有很多字符都需要转义,就需要加很多
\,为了简化,Python还允许用r''表示''内部的字符串默认不转义。 -
布尔值
Ture False
布尔值可以用
and、or和not运算。and运算是与运算,只有所有都为True,and运算结果才是True:or运算是或运算,只要其中有一个为True,or运算结果就是True:not运算是非运算,它是一个单目运算符,把True变成False,False变成True: -
空值
空值是Python里一个特殊的值,用
None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。 -
变量
变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和
_的组合,且不能用数字开头
三、字符串
要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes
-
ord()
获得字符的ascll值表示
-
chr()
将ascll编码转化为字符
如果bytes中包含无法解码的字节,decode()方法会报错:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
-
len()
计算字符数
在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
你可能猜到了,%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。
常见的占位符有:
| 占位符 | 替换内容 |
|---|---|
| %d | 整数 |
| %f | 浮点数 |
| %s | 字符串 |
| %x | 十六进制整数 |
有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%
format()
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
f-string
最后一种格式化字符串的方法是使用以f开头的字符串,称之为f-string,它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换:
>>> r = 2.5
>>> s = 3.14 * r ** 2
>>> print(f'The area of a circle with radius {r} is {s:.2f}')
The area of a circle with radius 2.5 is 19.62
enumerate
for x,y in enumerate(s)
y是s中的单个元素内容
x是s中的元素序号
zip
可以在一次循环里分别从多个字符串中获得元素
for a,b in zip(s,reverseSTring(s))
zip 和 enumerate 可以套用
四、列表、元组、字典、集合
list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
list的索引从0开始 classmates[0]
如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素
比如,列出班里所有同学的名字,就可以用一个list表示:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
也可以把元素插入到指定的位置,比如索引号为1的位置:
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
要删除list末尾的元素,用pop()方法:
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
!!初始化列表
In [7]:c = [[0] * 5 for _ in range(5)]
In [8]:c[0][0]='这个方法行'
In [9]:c
Out[9]:
[['这个方法行', 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
A = [[0 for _ in range(p)]for _ in range(n)]
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:
>>> classmates = ('Michael', 'Bob', 'Tracy')
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。
定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义
tuple 可以套用list使得tuple里的值可以发生改变
dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
>>> 'Thomas' in d
False
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
set也不可以存储list
注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
重复元素在set中自动被过滤:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通过remove(key)方法可以删除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}
五、判断
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elif和else,所以,请测试并解释为什么下面的程序打印的是teenager:
if判断条件还可以简写,比如写:
if x:
print('True')
只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。
这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情:
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
age = 15
match age:
case x if x < 10:
print(f'< 10 years old: {x}')
case 10:
print('10 years old.')
case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
print('11~18 years old.')
case 19:
print('19 years old.')
case _:
print('not sure.')
使用match语句时,我们依次用case xxx匹配,并且可以在最后(且仅能在最后)加一个case _表示“任意值”,代码较if ... elif ... else ...更易读。
match语句除了可以匹配简单的单个值外,还可以匹配多个值、匹配一定范围,并且把匹配后的值绑定到变量
匹配列表
match语句还可以匹配列表,功能非常强大。
match args:
# 如果仅出现gcc,报错:
case ['gcc']:
print('gcc: missing source file(s).')
# 出现gcc,且至少指定了一个文件:
case ['gcc', file1, *files]:
print('gcc compile: ' + file1 + ', ' + ', '.join(files))
# 仅出现clean:
case ['clean']:
print('clean')
case _:
print('invalid command.')
第一个case ['gcc']表示列表仅有'gcc'一个字符串,没有指定文件名,报错;
第二个case ['gcc', file1, *files]表示列表第一个字符串是'gcc',第二个字符串绑定到变量file1,后面的任意个字符串绑定到*files(符号*的作用将在
第三个case ['clean']表示列表仅有'clean'一个字符串;
最后一个case _表示其他所有情况。
可见,match语句的匹配规则非常灵活,可以写出非常简洁的代码。
六、循环
-
for in
所以
for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name) -
range()
生产一个整数序列。
-
while
第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)要特别注意,不要滥用
break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉break和continue语句。有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用
Ctrl+C退出程序,或者强制结束Python进程。
七、函数
首先函数由def进行定义;由两部分组成:header和body
函数可以提供多个参数,也可以没有参数
一些基本数字函数
abs() #绝对值
max() #最大值
min() #最小值
pow() #次方运算
round() #取最近的一个整数
-
map
用于将一个函数应用于一个可迭代对象(如列表、元组等)的所有元素。
map()函数会返回一个迭代器,该迭代器生成了通过函数应用后的所有结果。这里,
function是要应用的函数,iterable是一个或多个可迭代对象。当提供多个可迭代对象时,function必须接受相同数量的参数。map(function, iterable, ...) -
join
此函数可以解决列表有框的问题,
print(''.join(List)) #但是join只能对字符串使用
如果列表中全是整数可以用map进行操作
print(''.join(map(str,List))
八、文件操作
-
open()
用于打开一个文件,并返回文件对象
close()
关闭文件
open(file,mode)
open会接受两个参数 file为需要读写文件的路径
mode是模式
-r 读取 -rb 以二进制形式读取
-w 写入文件 -a 追加写入文件在r 和 rb模式下
read 读取整个文件
readline 读取文件的一行
readlines 读取文件的所以行
在w 和 a模式下
write #W是覆盖性书写 A是追加式书写
writelines
-
with open(file,mode,encoding="") as abb
abb是你接收的变量
浙公网安备 33010602011771号