聪明办法学python task5 + 代码风格

发布时间 2023-11-29 16:52:51作者: 何梓涵

Python 基础

输入---print()

直接使用print()函数,在括号中加入字符串(可以用双引号也可以用单引号,不能混用)

print()也可接受多个字符串,用逗号隔开,遇到逗号输出一个空格

输出---input()

输出使用input()函数

![屏幕截图 2023-11-13 192454](C:\Users\ASUS\Pictures\Screenshots\屏幕截图 2023-11-13 192454.png)

name是一个变量,第一次输入后,输入的内容存到了name里

第二次输入name就会显示上次输入的内容

除此之外还可以直接使用print()函数

image-20231113192838701

input()还可以显示一个字符串

image-20231113193628508

input()可以读取用户的输入,但是其返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数,so,Python提供了int()函数来完成这件事

s = input('birth = ')
birth = int(s)
if birth < 2000
	print('00前')
else 
	print('00后')

循环

行与缩进

Python中运用缩进来表示代码块,不用{ },缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数

image-20231115000933210

ps:至于为啥输出True,条件语句从上往下判断,符合某个判断,就执行该判断下的语句,剩下的都忽略

数据类型和变量

数据类型

  • 整数

    对于很大的数,例如10000000000,很难数清楚0的个数。Python允许在数字中间以_分隔,因此,写成10_000_000_00010000000000是完全一样的。十六进制数也可以写成0xa1b2_c3d4

  • 浮点数

    浮点数可以用数学写法,如1.233.14-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x10的9次方就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

  • 字符串

    字符串是以单引号'或双引号"括起来的任意文本,比如'abc'"xyz"等等。请注意,''""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有abc这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I'm,空格,OK这6个字符。

    如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识,比如:

image-20231113194832236

image-20231113194853251

如果Python中很多字符都需要转义,就需要加很多\

为了简化,Python中还允许r ' '表示 ‘ ‘内部的字符串默认不要转义

image-20231113195353953

如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容

image-20231113195554409

切片

img

可以对比访问list中的元素

[ : ] ---> 截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。

  • 布尔值

    布尔值和布尔代数的表示完全一致,一个布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来:

    image-20231113223418374

    image-20231113223608423

    or运算只要其中有一个正确就输出True

    and运算全部正确才输出True 否则False

    not运算是单目运算符 把True变成False 把False变成True

    image-20231113223942334

    type()函数

    返回一种数据类型

    image-20231115141035738

    image-20231115141325523

    Notice:type也是一种数据类型

变量

在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。

变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头

在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值而且可以是不同类型的变量

image-20231113200338055

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言

静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错

也可以把一个变量a赋值给另一个变量b这个操作实际上是把变量b指向变量a所指向的数据

在C语言中,可以认为变量是一个box,然后往box中存储内容;

**but在Python中,变量是一个tag(标签),在计算机最原始的结构,可以把它认为是一个很长的空间(类比C语言中的数组),当输入语句a = 10时,计算机发现要让一个10存进来把他赋值给a,并给他合适的空间,当下次用a的时候,根据上次存进来的地址进行操作(类比C语言指针) **

常量

所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量

PI = 3.1415926535

在Python中有两种除法:

image-20231113224641836

/除法计算结果是浮点数,如果是整数恰好整除也是浮点数

//除法运算成为地板除 相除结果永远是整数

字符串和编码

字符编码

Python的字符串支持多种语言,以Unicode编码

image-20231114150612700

对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

image-20231114150932302

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

Python对bytes类型的数据用带b前缀的单引号或双引号表示:

image-20231114151119520

前者是str,后者虽然内容和前者一样,但bytes的每个字符只占用一个字节

要计算str包含多少个字符,可以用len()函数,如果换成bytes,就计算字节数

image-20231114151507366

格式化

  • Python中格式化字符串的方法和C语言一样,运用%

image-20231114151939448

Notice!:如果不确定用什么,%s永远起作用

image-20231114152326507

  • 另一种格式化字符串的方法是format,它会用传入的参数依次替换字符串内的占位符{0}{1}……,

不放图了。。。。。。。

  • 最后一种方法---------f-string

    最后一种格式化字符串的方法是使用以f开头的字符串,称之为f-string,它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换

image-20231114152809048

列表,元组和字典

列表(list)

List是一种有序的集合,可随时添加和删除其中的元素

  • 使用len()函数可获取列表的长度

image-20231114181138873

  • 用索引访问列表中每个位置的元素(对照C语言中的数组)

image-20231114181327974

  • -1也可以做索引,直接访问最后一个元素,以此类推

image-20231114181445478

  • list是一个可变的有序表,可以往list中追加元素到末尾----------使用.append

image-20231114181735162

Notice!:不要忘记列表名后边加“ . ",然后再加append

  • 也可以把元素插到指定位置---------使用.insert

image-20231114181956755

  • 要删除末尾的元素,使用pop()

image-20231114182147564

  • 要删除指定位置的元素,使用pop(i)

image-20231114182348784

  • 要替换某个元素,直接赋值

image-20231114182426174

list中的数据类型也可以不同,list元素也可以是另一个list

image-20231114182857649

可以类比C语言中的二维数组哦

元组(tuple)

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改

image-20231114190053687

当定义只有一个元素的tuple时,记得在元素后加上逗号

image-20231114190449929

括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

接下来看一个“可变的”tuple

image-20231114190645278

字典(dict)

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

比如查找学生成绩:

image-20231114195517318

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

image-20231114195941618

一个key只能对应一个value,多次对一个key放入value,只保留最后一个(类比C语言多次赋值)

  • 要避免key不存在的现象,可以通过in判断

image-20231114200237074

  • 还可以通过get(),key不存在,则返回None,key存在则返回value

    image-20231114200557031

  • 要删除一个key,可以用pop(key)的方法

image-20231114200856961

需要牢记的第一条就是dict的key必须是不可变对象。

在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key

set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个list作为输入集合

image-20231114201515668

Notice:传入的参数是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。

重复元素也会在set中被自动过滤

image-20231114201743110

add(key)的方法可以添加元素到set中,remove(key)的方法可以删除元素

image-20231114201855417

可以把set当成集合

image-20231114202424863

类比数学上的并集和交集

条件判断

和C语言一样,Python使用if和elif做条件判断

if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elifelse,所以,下面的程序打印的是teenager`:

age = 20
if age >= 6
	print('teenager')
elif age >= 18
	print('adult')
else
	print('kid')

match语句

score = 'B'
if score == 'A'
	print('score is A')
elif score =='B'
	print('score is B')
else 
	print('invalid score')
score = 'B'
match score:
	case 'A':
        print('score is A')
    case 'B':
        print('score is B')
    case _:   # _表示未匹配到任何一种情况
        print('score is ???')

match语句可类比C语言中的Switch语句哦

复杂的匹配
age = 15

match age:
    case x if x < 10: #表示当age < 10时匹配,并且赋值给变量x
        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.')

匹配列表
args = ['gcc','hello.c','world.c']

match args:
    case ['gcc']:
        print('gcc:missing source file(s)')
    case ['gcc',file1,*files]: #出现gcc且至少指定一个文件
        print('gcc compile: '+ file1 + ',' + ','.join(files))
    case _:
        print('invalid command')

*case ['gcc',file1,*files]:表示列表第一个字符串是 ‘gcc’,第二个字符串绑定到变量file1,后面任意个字符串绑定到 files

for...in 循环

for x in ...就是把每个变量带入x,然后执行缩进块的语句

names = ['hzh','zzy','tyut']
for name in names:
    print(name)

执行以上代码,会依次打印names中的每一个元素

range()函数

image-20231114194556145

range(18)生成0到17的整数序列,在通过list()函数可以转化成list,最终以list的形式输出

sum = 0
for x in range(100):
    sum = sum + x
print(sum)
break和continue

不再赘述,和C语言中一模一样

函数

image-20231124090414030

语法

def 函数名(参数列表):
	函数体

函数调用

类比C语言

#判断素数
def prime(num):
    if n < 2:
        return False
    for i in range(2,int(num**0.5)+1):
        if num % i == 0:
            return False
    return True

n = int(input())
if prime(n):#调用函数
    print(n)

参数传递

a = 1
a = 'hzh'
#在上述代码中,1是int类型,'hzh'是string类型,而a没有类型
#a仅代表一个指针(用来引用对象),可以指向不同的对象

return语句

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。

代码参考函数调用部分

文件操作

写入文件

steps: 1.打开 2.写入 3.关闭

image-20231128142030739

f = open('readme.txt','w')
f.write('hello world')
f.close

使用with语法写入文件

with open('readme.txt','w') as f:
    f.write('hello world')
    #print('hello world',file = f)也可以使用print函数

读取文件

f = open('readme.txt','r')
for i in f:
    print(i)#读取文件中的每一行
f.close

使用with方法读取文件

with open('readme.txt','r') as f:
    for i in f:
        print(i)

代码风格

修饰的前提是跑通代码

(debug万岁)

代码布局

缩进

1.如果开始有定界符,其余缩进要与其对齐

2.用好Tab键

3.多行if语句衔接 需要一个额外的缩进 用以区分

换行

1.所有行限制为最多79个字符

2.一般与拒绝接受“隐式延续”,with语句不支持 需要用反斜杠\来衔接

3.assert语句

4.通常不鼓励使用复合语句(同一行上的多个语句)

#不推荐以下写法
with open('/path/to/some/file/you/want/to/read') as file1,open('/path/to/some/')

#推荐以下写法
with open('/path/to/some/file/you/want/to/read') as file1, \
		open('/path/to/some/file/being/written','w') as file2:
    file2.write(file1.read())

python里更推荐换行而不是用分号

导入规范

import本地模块/包

1.导入自己封装好的一些模块时 用import来导入

2.如果需要在m1.py文件下导入同目录的m2.py文件 直接导入

'''
Tree
|____m1.py
|____m2.py
|____Branch
     |____m3.py
     |____m4.py
'''


#wrong
import os
import m3
m3.printSelf()

#correct
from Branch import m3
m3.printSelf()

关于空格

1.在圆括号方括号和大括号内,不需要多余空格

2.在逗号,分号和冒号之前 尾随逗号之后不需要多余空格(容易出bug)

3.在切片中,两个冒号必须运用相同的间距

4.紧接在开始函数调用的参数列表的左括号之前 不需要空格

​ eg. def function(argc):

​ 而不是 def function (argc):

5.赋值或其他运算符周围需要多个空格以使其与另一个运算符对齐