聪明办法学python

发布时间 2023-11-25 19:26:43作者: 爱睡觉的毛豆

一、输入输出

在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----
    """)       #一次输出多行
  • 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

    布尔值可以用andornot运算。

    and运算是与运算,只有所有都为Trueand运算结果才是True

     

    or运算是或运算,只要其中有一个为Trueor运算结果就是True

     

    not运算是非运算,它是一个单目运算符,把True变成FalseFalse变成True

     

  • 空值

    空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

     

  • 变量

    变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。

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

三、字符串

要注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

以Unicode表示的str通过encode()方法可以编码为指定的bytes

  • ord()

    获得字符的整数表示

  • chr()

    将编码转化为字符

如果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

 

四、列表、元组、字典、集合

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]]

 

 

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,把该判断对应的语句执行后,就忽略掉剩下的elifelse,所以,请测试并解释为什么下面的程序打印的是teenager

if判断条件还可以简写,比如写:

if x:
  print('True')

只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False

这是因为input()返回的数据类型是strstr不能直接和整数比较,必须先把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)

    要特别注意,不要滥用breakcontinue语句。breakcontinue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到breakcontinue语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉breakcontinue语句。

     

    有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。

七、函数

首先函数由def进行定义;由两部分组成:header和body

函数可以提供多个参数,也可以没有参数

一些基本数字函数

abs()  #绝对值
max() #最大值
min() #最小值
pow() #次方运算
round() #取最近的一个整数