没学C++,如何从C语言丝滑过度到python【python基础万字详解】

2023-11-14

在这里插入图片描述
大家好,我是纪宁。
文章将从C语言出发,深入介绍python的基础知识,也包括很多python的新增知识点详解。

文章目录


思维导图:
在这里插入图片描述

1.python的输入输出,重新认识 hello world,重回那个激情燃烧的岁月

在C语言中,在进行输入输出的时候,通常要遵循一定的格式,如变量名必须与变量的类型严格对应,输出输入的每一个变量都要在数量和格式上都要一一对应,而 python 变得更加简洁和方便

1.1 输出函数print的规则

python 中的输入函数是print,相比于C语言,少了一个f,但功能却方便了很多。想输出什么(变量或者直接输出),就直接往 print 函数里面塞就行了,不用管什么格式,数据类型。但它的多组输出还是会有一定的规则,否则使用者也难以很好的把握输出的格式。
下面是 print 函数输出不同于 C 的一些规则:

  • 同一个 print 函数的输出中,通常会默认每个数据之间以空格分开(C中却是默认不分开),而要去掉这以规则,可以在 print函数内部加上 sep 参数。给 sep 参数赋值可以使一个 print 函数打印出的每个数据之间以任意方式隔开,如空字符,逗号等等。
  • 而在多个 print 函数的输出中,通常会默认这些数据之间会自动换行,如果想去掉这一规则,可以在 print 函数内部加上 end 参数,给 end 参数赋值,可以是每个 print 输出的值以给 end 赋的值隔开。
    在这里插入图片描述

为什么可以这样呢?其实在python 的 print 函数内部,是有 end 参数和 sep 参数的,只不过在不使用这两个参数的情况下,系统会默认 end 参数的值为‘\n’,sep 参数的值为‘ ’(空格),所以就出现上述情况。

1.2 输入函数input的规则

python 中的输入函数是 input ,相对于C语言,input 函数也是比较方便。input函数可以直接读取从终端(键盘)输入的数据并存储到变量中,也可以在给出提示后,将想要的答案通过键盘输入并存储到变量中。
在这里插入图片描述
上面代码意思是从控制台输入一个值,再将这个值赋值给变量,其中input 括号里的文字提示在没有的情况下,效果是一样的,但有问题提示就比较人性化一点。
有个问题需要注意的是,因为 input 函数在输入的时候没有规定数据类型,所以输入的数据默认都是以字符串的形式返回并赋值给变量。如果要进行计算,需要及时将输入的数据进行类型转化,否则就会报错。
在这里插入图片描述
需要什么类型的数据进行计算就转化为什么类型的数据。

1.3 用print将数据写入文件

同C一样,python 中如果要对文件进行操作,也需要先打开文件,操作完关闭文件。python中打开文件的函数为 open 函,关闭文件的函数为 close
在这里插入图片描述
open 函数的第一个参数为要写入文件的路径,第二个参数为对文件进行读写的模式。
print 函数的第一个参数是要写入的数据内容,第二个参数是要写入的文件对象。
下表为文件操作的一些常用模式
在这里插入图片描述
如下图,打开 D 盘中的 text.txt 文件,即可看到写入的 hello world。
在这里插入图片描述

2.数据类型、基本操作符与注释

2.1数据类型

python 中的数据类型分为 4 类,整型,浮点型,布尔型,字符串
在这里插入图片描述
整型、浮点型就不必多说了,和C完全相同。而python的布尔类型则是对真假的判断,True 为真,False 为假,并且他们True 的值默认为1,False 的值默认为0。
除了以下图片里的布尔值为False,其余均为True
在这里插入图片描述
字符串类型是不可变类型,可以用单引号、双引号,多引号来定义,其中单、双引号定义的字符串都必须在同一行,三引号定义的字符串可以在一行或者多行,如下图。
在这里插入图片描述
不同类型的数据如果要一起使用必须转化为同一种类型,浮点数和整形会自动将结果转化为浮点型数据,其他的类型在可转化的前提下可以使用类型转化函数将数据进行类型转化。

2.2 基本操作符

2.21 算数操作符

算数操作符中,最基本的加减乘、取模都与C相同。不同的是python中进行了除法分类,并加入了幂运算符
python 将除法分为了整数除法(//)和普通除法(/),而整数除法就是向下取整,大家应该懂的,和C一样,而普通除法可以进行正常的运算,两个整数相除也可以得到浮点数。
幂运算符(**)前面的操作数是幂运算的底数,后面的操作数是幂运算的次数。

2.22 逻辑操作符

在这里插入图片描述
逻辑与and、逻辑或or、逻辑非not,分别对应C语言中的&&,||,!运算符。
而 in 则是用于判断一个元素是否在一个容器中,具体来说,可以用于判断元素是否在列表、字符串、元组、集合、字典中,not in 正好相反,是判断元素是否不在容器中。

2.23 位操作符及操作符优先级

python的位操作符与C是一样的,有& 按位与 ,| 按位或, ^ 按位异或, ~ 按位取反,<< 左移, >>右移。具体方法与C中是一样的,这里就不过多赘述。
操作符的优先级
严格按照下面的优先级进行运算,如果不确定或者要先计算优先级低的运算记得加括号。
在这里插入图片描述

2.3 注释

python的注释方式也进行了改变,注释方式改为在语句前加 # 号
在 PyCharm 中,对多段语句进行整体注释方式是 Ctrl+ /

3.数据的存储

python中数据如何存储

python存储数据的逻辑图
在这里插入图片描述
每个数据都有自己的 id,而变量中存储的仅仅是这个数据的 id,编译器通过这个 id 就找到了这块的数据,进而进行一系列操作,这里的 id 类似于C中的地址,而这样的访问方式类似于指针。
可以用 is 来比较两个变量的 id 时候相等
在这里插入图片描述
返回True,说明变量 a 和 b 访问是同一块内存空间,完全相等。
在C中,数据会被存储到多个区域中,如堆区,栈区等等,下图为C中数据存储的区域
在这里插入图片描述
python中也有大量的区域供使用者存储数据

栈区:存储基本数据类型及其对象(如int、float、bool等),以及函数调用时的参数、返回值和局部变量等。栈内存自动分配和释放,具有快速的存取速度。
堆区:存储复杂对象(如列表、元组、字典等)及其对象。堆内存的分配与释放由Python解释器自动进行,可以通过Python中的垃圾回收机制自动释放内存。
数据区:存储全局变量和静态变量,以及常量等数据。
代码区:存储Python的字节码,即转换成机器码之前的中间代码。

在C中,需要手动分配和释放动态内存,而在Python中,内存管理是自动的,Python解释器会根据需要自动分配和释放内存。

4.分支和循环

分支和循环这里与C语言大同小异,逻辑上大同,语法规则上小异。

4.1 分支语句 if-else

python语法如下,与C相比,只是去掉了括号,如果if中包含多条语句,则可使用相同的缩进来代替C中的大括号。

if condition:
    # code to be executed if condition is True
else:
    # code to be executed if condition is False

其中,condition是一个表达式,如果结果为True,代码块1就会被执行,否则代码块2就会被执行。
下面是一个示例:

a = 10
if a > 0:
    print("a is positive")
else:
    print("a is not positive")

python 将 else if改成了elif 语句,用于添加多个条件分支。
条件表达式
python中的条件表达式类似于C语言中的三目操作符
例如,以下代码用条件表达式来检查变量x是否大于5,如果是,则将变量y的值设置为10,否则将其设置为0:

x = 7
y = 10 if x > 5 else 0
print(y)  # 输出 10

在这个例子中,条件表达式的条件是“x > 5”,如果为True,则返回值为10(即“y = 10”),否则返回值为0(即“y = 0”)。但这种条件表达式只适用于较为简单的分支情况,更复杂的条件逻辑,应该使用 if 语句来代替。

4.2 循环

while循环基本与C是一样的,一直循环某种结构,直到满足特定的条件为止。

while 条件:
    循环体

代码示例

i = 0
while i < 5:
    print(i)
    i += 1

Python中的for-in循环用于迭代遍历序列或集合中的每个元素。

for 变量名 in 序列:
    循环体语句

其中,变量名是循环变量,用于在循环中引用每个元素,序列可以是列表、元组、字符串、集合或字典等可迭代对象,循环体语句是需要重复执行的语句块
示例代码:

names = ['Alice', 'Bob', 'Charlie', 'David']
for name in names:
    print(name)

# 输出结果:
# Alice
# Bob
# Charlie
# David

在循环体中可以结合条件语句,实现更加灵活的控制流程。

4.3 pass语句

pass是一个空语句,它不执行任何操作。但它可以被用作占位符,表示"在这里不做任何事情",通常可以帮助我们搭建语法结构,因为Python需要在代码块中有至少一个语句。例如,当你想要先写下一些代码的框架但还没有想好实现时,可以在代码块中使用pass语句占位。

def my_function():
    pass

在上面的代码中,my_function 函数中没有任何操作,但由于使用了 pass 语句,它仍然可以正确地定义。如果没有 pass 语句,代码将会报错。

5.python基础数据结构

python的基础数据结构有字符串、元组、列表、字典、集合五种。
在这里插入图片描述
元组、字符串是不可变序列,自身不能进行增删查改等操作。
有序数列是有下标的
1.下标及索引规则
下标可以从前开始,也可以从后开始
从前开始的规则是从0 开始,依次递增1
从后开始的规则是从-1开始,依次递减1
在这里插入图片描述

5.1列表——python中的数组

在Python中,与C语言中的数组相对应的数据类型是列表(list)。列表可以用于存储多个元素,并且可以动态地增加或减少元素的个数。和数组类似,列表的元素可以通过索引访问,也可以使用循环遍历所有元素。但是,相比于数组,在Python中使用列表更为方便和灵活。
列表的创建
用一对方括号[]来表示一个空列表,或者在方括号内添加逗号分隔的值列表即可创建一个有元素的列表;还可以使用list()函数来创建一个列表:在list函数内放置多个值,如果是字符串,会将中每个字符单独作为元素。

5.1.1 列表的增删查改

列表中查询元素
在列表中查询列表元素有两种方法:第一种是列表名[索引],下标从0开始,第一个元素的索引为0,最后一个元素的索引为列表元素总数 sz-1;还可以‘倒着’索引:最后一个元素的索引为 -1,第一个元素的索引为sz,当然这两种索引的下标都是从小到大。
第二种是index(列表元素),可用于查找列表中某个元素第一次出现的位置,其基本语法如下:

list.index(x[, start[, end]])

其中,x 是需要查找的元素;start 和 end 是可选参数,表示查找的起始位置和结束位置,如果省略则默认查找整个列表。
如果该元素不存在于列表中,则会引发ValueError异常,可以使用try-except语句来避免程序崩溃。例如下面代码:

my_list = [1, 2, 3, 4, 5]
try:
    index = my_list.index(6)
    print(index)
except ValueError:
    print("Element not found in list")

增加元素
可以使用append()方法将一个元素添加到列表的末尾。也可以使用extend()方法将另一个列表的元素添加到当前列表的末尾,或者使用insert()方法将元素插入到指定的位置。

my_list = [1, 2, 3]
my_list.append(4)  #将一个元素添加到列表的末尾
print(my_list)  # [1, 2, 3, 4]
my_list = [1, 2, 3]
my_list.extend([4, 5])  #另一个列表的元素添加到当前列表的末尾
print(my_list)  # [1, 2, 3, 4, 5]
my_list = [1, 2, 3]
my_list.insert(1, 4)   #将元素插入到指定的位置
print(my_list)  # [1, 4, 2, 3]

删除元素
可以使用remove()方法删除指定的元素,还可以使用pop函数删除列表中指定位置的元素,或者使用del语句删除指定位置上的元素。

my_list = [1, 2, 3]
my_list.remove(2) #删除列表中的 2 元素
print(my_list)  # [1, 3]
my_list = [1, 2, 3]
my_list.pop(0) # 删除并返回1
print(my_list) # 输出[2,3] 
my_list = [1, 2, 3]
del my_list[1] #删除索引1位置的元素
print(my_list)  # [1, 3] 

修改元素
可以直接通过下标来修改指定位置上的元素。

my_list = [1, 2, 3]
my_list[1] = 4  #将索引1位置处的元素改为4
print(my_list)  # [1, 4, 3]

5.1.2 对列表进行其他操作

创建列表的副本

列表的副本是创建了一个新的列表,它包含与原始列表相同的元素,但实际上是一个不同的对象。因此,对副本所做的更改不会影响原始列表。 创建副本有下面几种方法

1.使用切片操作符[:]。例如,如果原列表是my_list,可以使用my_list[:]来创建一个副本,如下所示:

my_list = [1, 2, 3]
my_list_copy = my_list[:]

2.使用copy()方法。例如,如果原列表是my_list,可以使用my_list.copy()来创建一个副本,如下所示:

my_list = [1, 2, 3]
my_list_copy = my_list.copy()

3.使用list()函数。例如,如果原列表是my_list,可以使用list(my_list)来创建一个副本,如下所示:

my_list = [1, 2, 3]
my_list_copy = list(my_list)

对列表进行排序
在C语言中,如果我们要对数组元素进行排序,可能要使用冒泡排序、qsort排序等方法,而在python列表中,有专门的函数对列表进行排序。
降序排列

my_list = [3,1,4,1,5,9,2,6,5,3,5]
my_list.sort(reverse=True)
print(my_list)

升序排列

my_list = [3,1,4,1,5,9,2,6,5,3,5]
my_list.sort()
print(my_list)

求某元素在列表中出现的次数
第一种方法是对列表进行遍历,设立一个计数器,当出现某元素的时候,count就加1。

count = lst.count(x)
print(count)

也可以使用python的内置函数count来统计

count = lst.count(x)
print(count)

5.2 字典——python中的结构体

Python字典是一种无序的集合数据类型,它由一系列键值对组成,每个键值对之间用逗号分隔。字典中的键必须是唯一的,而值可以是任何类型的数据。字典是Python语言中常用的一种数据结构,可以直接使用,不需要定义或声明,并且它提供了灵活的数据组织和访问方式:直接通过键就可以访问键对应的值。
字典的创建方式
1、使用花括号{},用冒号分割键值: dict1 = {'key1': 'value1', 'key2': 'value2', ...},key与value是一一对应的。
2、使用内置函数dict()函数创建:dict2 = dict(key1='value1', key2='value2', ...)
3、使用dict.fromkeys()方法创建,键可以输入多种,而值只能是一种:dict3 =dict.fromkeys(['key1', 'key2', ...],100)
4、创建空字典:直接使用花括号{},里面不放值;使用dict()函数里面不放值。
字典定义示例

person = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

其中,键分别是"name"、“age"和"city”,对应的值分别是"John"、30和"New York"。可以通过键来访问对应的值。例如:

print(person["name"])  # 输出:John
print(person["age"])   # 输出:30

字典的内存是由python解释器自动管理内存的,在使用过程中不需要考虑内存分配和释放的问题。

5.2.1 字典常用的操作

  • 获取字典中的值:通过键来获取字典中的值,例如 dict[key]。

  • 添加新键值对:使用 dict[key] = value,可以向字典中添加新的键值对。

  • 修改键值对:通过键来修改字典中的值,例如 dict[key] = new_value。

  • 删除键值对:使用 del dict[key] 可以删除字典中的键值对。

  • 获取字典的长度:使用 len(dict) 可以获取字典中键值对的数量。

  • 判断键是否存在:可以使用 in 关键字判断一个键是否存在于字典中,例如 key in dict。

  • 获取所有键或所有值:使用 dict.keys() 可以获取字典中所有的键,使用 dict.values() 可以获取字典中所有的值。

  • 获取所有键值对:使用 dict.items() 可以获取字典中所有的键值对。

  • 清空字典:使用 dict.clear() 可以清空整个字典。

  • 复制字典:使用 dict.copy() 可以复制一个字典。

5.2.2 字典的特点

字典是无序的:字典中的条目没有固定的顺序,存储的顺序与定义时候的顺序无关。
字典是可变的:可以添加、删除或修改字典中的键值对。
字典中的键必须是不可变的类型,例如整数、浮点数、字符串或元组,而值可以是任何类型。
每个键只能在字典中出现一次,如果同一个键被多次赋值,则只有最后一个值被保留。
字典通常用于快速查找和检索,可以根据键快速访问值,时间复杂度为O(1)
字典的存储是’随机的’,依靠键来找值,因此浪费了大量的内存,是一种以空间换时间的数据结构。

5.3 元组

元组是python内置的数据结构之一,是一个不可变序列,可以包含任意类型的数据,如数字、字符串、列表、字典、元组等。
元组的创建
1、使用小括号()将元素括起来,用逗号分隔,例如:

(1,"hello",[3,4],5.6,{"纪宁":"赤明九天图"})

2、使用内置函数 tuple(),将列表或者其他迭代对象转化为元组,如 t=tuple([1,2,3])
3、可以省略小括号,逗号分隔的情况下直接创建元组,例如:t=1,“hello”,[3,4],5.6
4、只有一个元素是,加逗号以区分元组和表达式,例如:t=(1,)
5、空元组:()或者 t = tuple()
在这里插入图片描述
为什么要将元组设置为不可变序列?
元组被设计为不可变序列,因为它们可以用来表示一组不可变的数据,例如日期、时间、坐标等。一旦元组被创建,它们的值就不能被修改,这使得它们比可变序列更安全,因为它们不能被意外修改。此外,元组也比列表更加高效,因为它们的不可变性使得在处理大量数据时,它们能够更快速地被创建、操作和释放

5.4 集合

集合是一种python内置的数据结构,与列表、字典一样都属于可变类型的序列,并且集合里的元素是无序不重复的,所以集合相当于没有value的字典。
字典的创建

  • 直接{},例如s = {‘python’, ‘hello’ , 90}
  • 使用内置函数set(),括号里面可以包含多种数据类型的元素

创建空集合也需要使用set()函数,如果直接用大括号初始化空集合会被解释器认为是空字典。

5.4.1集合常用的操作

集合元素的新增

  • add():添加单个元素到集合中
  • update():添加多个元素到集合中

add()方法示例

# 定义一个空集合
my_set = set()
# 添加元素
my_set.add(1)
my_set.add(2)
my_set.add(3)
print(my_set)  # 输出:{1, 2, 3}

update()方法示例

# 定义一个空集合
my_set = set()
# 添加元素
my_set.update([1, 2, 3])
my_set.update([4, 5, 6])
print(my_set)  # 输出:{1, 2, 3, 4, 5, 6}

集合元素的删除

  • remove():按照元素值删除一个元素,如果元素不存在,就触发KeyError
  • discard():按照元素值删除一个元素,如果元素不存在,不报错
  • pop():随机删除集合中一个元素,并返回该元素,集合为空则触发KeyError
  • clear():删除集合中所有元素
s=set(range(1,6))
print(s) #{1,2,3,4,5}
s.pop()  #随机删除一个
print(s) # {2,3,4,5}   
s.discard(3) #删除集合元素 3
print(s)  #{2, 4, 5}
s.clear() #清空
print(s) #输出空集合

判断两个集合的关系

  • issubset()——s2.issubset(s1),判断s2是否是s1的子集
  • issuperset()——s1.issuperset(s2),判断s1是否是s2的超集
  • isdisjoint()——s1.isdisjoint(s2),判断s1和s2是否没交集

求两个集合交并集的方法

  • intersection——s1.intersection(s2),等价于 s1&s2,求s1与s2的交集
  • union——s1.union(s2),等价于 s1| s2,求s1与s2的并集
  • difference——s1.difference(s2),等价于s1-s2,求s1与s2的差集
  • symmetric_difference——s1.symmetric_difference(s2),等价于 s1^s2,求s1与s2的对称差集(并集 - 交集)

5.5 字符串

5.51 字符串常用操作

字符串查询

  • index(),在字符串中查找指定字符串,返回首次出现时候的索引,找不到就报错。
  • find(),在字符串中查找指定字符串,返回首次出现时候的索引,找不到则返回-1
  • rindex(),在字符串中查找指定字符串,返回最后一次出现时候的索引,找不到就报错
  • rfind(),在字符串中查找指定字符串,返回最后一次出现时候的索引,找不到就返回-1

字符串大小写转化

  • upper()——将字符串中所有字符都转化为大写字母
  • lower()——将字符串中所有字符都转化为小写字母
  • swapcase()——把字符串所有的大写转化为小写,小写转化为大写
  • capitalize()——把第一个字母转化为大写,其余字母转为小写
  • title()——把每个单词的第一个字母转化为大写,把每个单词的剩余字符转化为小写。

字符串对齐
字符串内容对齐是指将字符串中的内容按照一定的方式对齐,使其更加美观,易于阅读,并且符合视觉习惯。常见的字符串内容对齐操作包括左对齐、右对齐、居中对齐等。
若传递的字符串宽度 width 小于字符串长度,则返回字符串包本身

  • ljust()——左对齐
txt = txt.ljust(width,fillchar)

其中,width表示字符串的总宽度;fillchar表示要填充的字符,默认为空格。如果字符串长度小于width,则用fillchar在右侧填充,直到达到width长度。

  • rjust——右对齐
string.rjust(width, fillchar)

其中,width表示字符串的总宽度;fillchar表示要填充的字符,默认为空格。如果字符串长度小于width,则用fillchar在左侧填充,直到达到width长度

  • zfill——右对齐(用0填充)
string.zfill(width)

右对齐,只接收一个参数,用于指定字符串对齐的宽度

  • center——居中对齐
string.center(width,fillchar)

其中,width表示字符串的总宽度;fillchar表示要填充的字符,默认为空格。如果字符串长度小于width,则用fillchar在左右两侧均匀填充,直到达到width长度
字符串劈分
字符串劈分操作是指根据指定的分隔符将一个字符串拆分成多个子字符串。

  • splist(sep=,maxsplit),从字符串左边开始劈分,sep 是劈分字符,maxsplit 是劈分的最大次数
  • rsplit(sep=,maxsplit),从字符串右边开始劈分,sep 是劈分字符,maxsplit 是劈分的最大次数

在经过最大劈分次数后,剩余的子串将会单独作为一部分
判断字符串的方法

  • isidentifier(),判断字符串是不是合法的标识符
  • isspace(),判断字符串是否全部由空白字符组成(回车、换行、水平制表符等)
  • isalpha(),判断指定的字符串是否全部由字母组成(汉字也算字母)
  • isdecimal(),判断字符串是否全部由十进制数字组成
  • isnumeric(),判断指定的字符串是否全部由数字组成(Unicode编码中的数字字符)
  • isalnum(),判断指定字符串是否全部由字母和数字组成

isnumeric函数可以判断Unicode编码中的数字字符是否是数字,包括阿拉伯数字0-9、罗马数字、中文数字、泰语数字、藏文数字等,但 isnumeric函数 不能判断小数、负数、科学计数法等特殊的数字形式。
字符串替换

  • replace(),第一个参数是被替换的字符串的子串,第二个参数是替换的字符串,第三个参数是最大替换次数,函数返回替换后的字符串,原字符串不变,如果未找到子串,则不进行替换。
  • join(),用于将一个可迭代对象(如list、tuple等)中的元素用某字符连接成一个字符串。
separator = ' '  # 连接符(可以为任意字符)
seq = ['apple', 'banana', 'cherry']   # 可迭代对象,如果只有一个字符串,就默认字符串本身为可迭代对象
result = separator.join(seq)   # 将seq中每个元素用separator连接起来
print(result)  # 输出 'apple banana cherry'

5.52 字符串的比较及字符的Unicode编码

字符的Unicode编码
每个字符都有对应的Unicode编码,类似于C语言中的ASCII码,但更全面。Unicode编码的前128个就是ASCII,并且Unicode编码为所有字符都设立的编码,更全面。

  • ord(),ord函数可以将一个字符转化为其对应的 Unicode编码。
  • chr(),chr函数可以将Unicode编码转化为对应的字符。

字符串的比较
先比较两个字符串中的第一个字符的Unicode编码,如果相等,则继续比较下一个字符,依次比较下去,直到两个字符不相等,其比较结果就是两个字符串的比较结果,后续字符串中的字符将不再被比较。
字符串相等 is ,比较的是两个字符串的地址(id)是否相等;而字符串相等 ==,比较的是两个字符串的值(value)是否相等。

5.53 格式化字符串

为什么要格式化字符串?
在这里插入图片描述
如图,这就是一种‘格式化’,需要改的地方只有 xxx 的部分,极大提高了工作效率。
格式化字符串的方式
在这里插入图片描述

例如:在这里插入图片描述

5.54 字符串的编码转化

为什么要进行字符串的编码转化

  1. 传输数据:在网络传输和存储中,需要将字符串编码转换为字节流的形式。例如,使用 HTTP 请求和响应传输数据时,需要将数据转换为 UTF-8 或其他编码格式的字节流。

  2. 多语言支持:不同语言使用不同的编码方式,进行编码转换可以确保在不同语言之间传输数据时不会出现乱码。

  3. 安全性:某些字符可能被用于编写恶意代码或注入攻击,进行编码转换可以保障系统的安全性。

  4. 数据库操作:在将数据存储到数据库中时,可能需要将字符串进行编码转换,以确保数据库支持该编码格式并且能正确存储和检索数据。

  5. 业务需求:有时候,业务需求需要将字符串转换为指定的编码格式,以满足特定场景的要求。例如在一些人工智能领域中,需要将文本进行编码转换以方便进行文本分析和处理。

在这里插入图片描述

  • 编码:s.encode(ending=‘GBK’) 或者 s.encode(ending=‘UFT-8’),将字符串s转化为二进制数据
  • 解码:s.decode(ending=‘GBK’) 或者 s.decode(ending=‘UFT-8’),将二进制数据转化为字符

编和解的字节流必须统一,如用’GBK’编码,就必须使用’GBK’解码,使用’UFT-8’编码就必须使用’UFT-8’解码。

5.6 生成式合集

5.6.1 字典生成式

内置函数zip():用于将迭代对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表。
字典生成式语法格式:

{key: value for key, value in iterable}

其中,key表示字典的键,value表示字典的值,iterable表示可迭代对象,例如列表、元组、字典等。生成式会遍历iterable中的每个元素,根据指定的规则创建一个新的字典。
假设我们有两个列表,先使用 zip 函数将对应元素打包为元组再返回

items=['Fruits','Book','Others']
prices=[96,78,85]
lst=zip(items,prices)

再使用字典生成式生成一个键值对应的字典

d = {items:prices for items,prices in lst}

在这里插入图片描述

5.6.2 列表生成式

内置函数range():range函数是一个内置函数,用于生成一个整数序列。range函数有三种形式:

  • range(stop) 生成一个从0开始到stop-1的整数序列,默认步长为1。

  • range(start, stop) 生成一个从start开始到stop-1的整数序列,默认步长为1。

  • range(start, stop, step) 生成一个从start开始到stop-1的整数序列,步长为step。

例如,range(5)将生成序列(0, 1, 2, 3, 4),range(2, 7)将生成序列(2, 3, 4, 5, 6),range(1, 10, 2)将生成序列(1, 3, 5, 7, 9)。

range函数一般被用在循环语句中,如for循环,来遍历一个序列或执行指定次数的循环。

5.6.3 集合生成式

集合生成式的基本语法为:

{expression for item in iterable}

expression通常是某个变量或表达式,item是可迭代对象中的元素,iterable是可迭代对象,例如列表、元组、字典等。
例如:

nums = [1, 2, 3, 4, 5]
squares = {x*x for x in nums}
print(squares)

集合表达式也支持添加条件表达式,例如:

nums = [1, 2, 3, 4, 5]
squares = {x*x for x in nums if x > 2}
print(squares)

添加条件 x>2 后,只有当x.2时,才进行迭代生成集合表达式。

5.7 切片

字符串、列表、元组等有序数据结构中支持切片操作,切片可以获取这些有序数据结构的子序列。切片操作不会改变原序列,它会返回一个新序列,包含指定范围的元素。
切片语法:

string=str[start:stop:step]

start为切片的起始位置,stop为切片的结束位置(不包括该位置对应的元素),step为切片的步长。如果省略start,则默认为0;如果省略stop,则默认为序列的长度;如果省略step,则默认为1。

6.函数——新瓶装旧酒

同C语言一样,在 Python 中,函数是一种可重用的代码块,用于执行某些特定的任务。函数可以带有参数或不带参数,也可以返回值或不返回值。C语言函数详解
函数定义的一般语法:

def add_numbers(num1, num2):
    """This function adds two numbers."""
    result = num1 + num2
    return result
  • def:定义函数的关键字;
  • function_name:函数名称,应以字母或下划线开头;
  • parameters:函数参数,可以是一个或多个,也可以为空;
  • docstring:函数文档字符串,对函数的功能进行描述,可选;
  • statements:函数体,函数需要执行的代码语句。

下面用python实现一个简易的计算器,帮助大家更好的理解函数

    # 加法
    def add(self, x, y):
        return x + y
    # 减法
    def subtract(self, x, y):
        return x - y
    # 乘法
    def multiply(self, x, y):
        return x * y
    # 除法
    def divide(self, x, y):
        if y == 0:
            return "除数不能为0"
        return x / y
# 获取用户输入
print("请选择运算:")
print("1、加法")
print("2、减法")
print("3、乘法")
print("4、除法")
choice = input("请输入需要进行的运算符号(1/2/3/4): ")
num1 = int(input("请输入第一个数字: "))
num2 = int(input("请输入第二个数字: "))
# 执行计算,传递两个参数 num1和num2
if choice == '1':
    print(num1,"+",num2,"=", add(num1,num2))
elif choice == '2':
    print(num1,"-",num2,"=",subtract(num1,num2))
elif choice == '3':
    print(num1,"*",num2,"=", multiply(num1,num2))
elif choice == '4':
    print(num1,"/",num2,"=",divide(num1,num2))
else:
    print("请输入正确的选项")

Python函数传参的特点如下

  1. 位置参数:按照形参定义位置传递的参数;
  2. 关键字参数:按照形参名称传递的参数;
  3. 默认参数:在函数定义时给形参指定默认值,如果没有传入对应的实参,则使用默认值;
  4. 可变参数:*args,用来传递任意个参数,以元组的形式传递;
  5. 关键字可变参数:**kwargs,用来传递任意个关键字参数,以字典的形式传递。

位置实参:和C语言函数传参的规则相同,实参和形参一一对应
在这里插入图片描述 将10传给形参a,20传给形参b
关键字实参
在这里插入图片描述根据形参名进行实参传
关键字实参的传参规则是,先在形参里找实参关键字,将找到的实参传递给对应形参,剩余的则进行依次传参。
可变参数
将形参定义为 *args,可接受任意个实参传递,结果为一个元组。
在这里插入图片描述
关键字可变实参
将形参定义为**args,可接受任意个关键字实参,结果为一个字典。
在这里插入图片描述
函数传参的内存图
例如下面的代码

def fun(arg1,arg2):
    print("agr1=",arg1,"agr2=",arg2)
    arg1=100
    arg2.append(10)
    print("agr1=",arg1,"agr2=",arg2)
n1=10
n2=[22,33,44]
print("n1=",n1,"n2=",n2)
fun(n1,n2)
print("n1=",n1,"n2=",n2)

在这里插入图片描述
运行结果:
在这里插入图片描述
说明同C语言一样,C中形参是实参的一份临时拷贝,对实参的改变不影响实参。在python程序中,实参是临时定义的一个与实参指向相同的变量,改变形参的指向不能改变实参的指向,但在形参指向的首地址后面添加或删除数据是可以的起到改变实参值的作用的,因为实参也是指向这块内存的首地址,但绝对改变不了实参的指向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没学C++,如何从C语言丝滑过度到python【python基础万字详解】 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 如何在python 3.7中生成条形码

    我正在使用 python 3 7 为了生成条形码 我尝试使用安装 pyBarcode 库pip install pyBarcode 但它显示以下错误 找不到满足 pyBarcode 要求的版本 来自版本 找不到 pyBarcode 的匹配分
  • 使用 python 中的公式函数使从 Excel 中提取的值的百分比相等

    import xlrd numpy excel Users Bob Desktop wb1 xlrd open workbook excel assignment3 xlsx sh1 wb1 sheet by index 0 colA co
  • 如何检查python xlrd库中的excel文件是否有效

    有什么办法与xlrd库来检查您使用的文件是否是有效的 Excel 文件 我知道还有其他库可以检查文件头 我可以使用文件扩展名检查 但为了多平台性我想知道是否有任何我可以使用的功能xlrd库本身在尝试打开文件时可能会返回类似 false 的内
  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • [STL]vector常见用法详解

    目录 引入 常见用法介绍 1 vector的定义 2 vector容器内元素的访问 3 vector常用函数实例解析 1 push back 2 pop back 3 size 4 clear 5 insert 6 erase vector
  • 如果有一天程序员再也不忙了

    前言 程序员是世界上最可爱的人 正文 一 程序员是什么 二 程序员写的代码有什么用 三 程序员最本质的不同是什么 四 程序员为什么找不到妹子 五 程序员的工作究竟有多忙 六 有一天程序员不忙了会怎样 七 找不到妹子真的是因为工作忙吗 八 你
  • .NET Core 获取自定义配置文件信息

    官方文档说 引用 Microsoft AspNetCore App 元包或将包引用添加到 Microsoft Extensions Options ConfigurationExtensions 包 简而言之 直接可以获取 不用引用包了 a
  • 盖茨来了:比起去火星,地球有些事更紧迫

    2023年6月14日晚 比尔 盖茨在微博更新了一条消息 他写道 我刚降落在北京 这是我2019年以来的首次访问 盖茨基金会与中国伙伴合作应对全球健康和发展挑战已经超过15年 我非常高兴能与中国的伙伴们见面 在减少儿童死亡和贫困方面 世界取得
  • CSS层叠样式表-选择器

    1 CSS 1 特点 相同属性会覆盖 不同属性会叠加 2 引入方式 外部样式 在head标签中使用link标签引入css文件 内嵌样式 在head标签中使用style标签进行书写 行内样式 在对应标签中添加style属性 1 外部样式 W3
  • 二叉查找树实现

    package leetcode May import java util ArrayList import java util List description 二叉查找树 author qiangyuecheng date 2022 5
  • 小程序单独页面生成二维码

    给单独的小程序页面生成一个二维码 比如某个商品 1 登录小程序绑定的公众号后台 2 选择 工具 生成小程序码 输入小程序AppID 复制页面路径 截图保存完成
  • 天才中的天才—冯·诺依曼简介

    https www toutiao com i6707878069182398988 参考 数学扫地僧 冯 诺依曼 John von Neumann 1903 1957 美国数学家 原籍匈牙利 毫无疑问 冯 诺依曼是20世纪最重要的数学家之
  • 关于 Unknown column ‘xxx‘ in ‘field list‘ 的问题解决

    Unknown column xxx in field list 在开发中出现了此类报错 Error querying database Cause java sql SQLSyntaxErrorException Unknown colu
  • 怎样配置炒股用的计算机,炒股专用电脑配置

    炒股专用电脑配置 一 显卡 1 欲购六屏且囊中羞涩的股民朋友 显卡可以选择AMD的六屏显卡 为避广告嫌疑 此处便不列举具体型号了 而预算稍充足一些的便推荐更加稳定的英伟达图形工作站系列显卡 如Nvidia Quadro P620 2 对于四
  • 计算机专业 拒绝清华,2次拒绝北大邀请,获清华保送生资格,网友:清华计算机全球第一...

    原标题 2次拒绝北大邀请 获清华保送生资格 网友 清华计算机全球第一 能够获得北京大学的盛情邀请 应该是一种极大的光荣吧 更何况连高考都不用参加 可以直接入学 不过 这位高三生 却2次拒绝了北大数学系的邀请 理由是 他更喜欢计算机 最终 这
  • 隐马尔可夫模型(HMM)的分类

    1 遍历型 ergodic model 即每个状态都可以由任意一个状态演变而来 aij gt 0 for all i j 如图 2 left right type of HMM 每个状态只能由下标值小于当前值得状态以及其本身转移而来 即从左
  • 如何解决x盘莫名出现的msdia80.dll文件

    如何解决x盘莫名出现的msdia80 dll文件 参考文章 https zhuanlan zhihu com p 138954717
  • 在latex中如何编写方程组,并且带文字或者范围分段,以及如何使用空格使其对齐

    在latex中如何编写方程组 并且带文字或者范围分段 以及如何使用空格使其对齐 begin equation O ij t begin cases x it x oi t y it y oi t quad text Obstacles ex
  • 【卷积神经网络】卷积层,池化层,全连接层

    转于 入门PyTorch 卷积层是卷积神经网络的核心 大多数计算都是在卷积层中进行的 1 卷积层 1 1 概述 首先介绍卷积神经网络的参数 这些参数是由一些可学习的滤波器集合构成的 每个滤波器在空间上 宽度和高度 都比较小 但是深度和输入数
  • UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte

    遇到python转码问题解决方案 利用notepad进行转码 如图 转为 utf 8保存重新运行 完美解决 ps 又遇到了一个分隔符错误 只需要添加以下就可以 df pd read csv D workspace python demo 长
  • Blender基础:曲线建模基础

    1 曲线建模 曲线Curve 也称为样条 用于描绘平滑的曲线和形状 一般分为两种 贝塞尔曲线 Nurbs曲线 添加一条曲线 添加 gt 曲线 gt 贝塞尔曲线 按7 进入顶视图 按TAB 编辑曲线 选择移动工具 移动控制点或控制柄 按TAB
  • 趣事

    一 谁发明了微积分 1 一篇文献引起的巨人相搏 如果要在科学史上找出一次最重要的巨人相争 牛顿与莱布尼茨围绕微积分发明权的争论无疑是当仁不让之选 1684 年 10 月 莱比锡大学学术刊物 学术论文集 刊载了一篇名字烦琐冗长的论文 一种求极
  • Python Pandas 行数据筛选方法汇总

    Pandas 行数据筛选 一 准备数据 二 通过逻辑规则筛选 大于 小于等 三 删除重复元素 三 显示最前面 最后面的 n 行 3 1 显示前面 n 行 3 2 显示后面 n 行 四 随机抽取 4 1 随机抽取一定比例 4 2 随机抽取 n
  • 没学C++,如何从C语言丝滑过度到python【python基础万字详解】

    大家好 我是纪宁 文章将从C语言出发 深入介绍python的基础知识 也包括很多python的新增知识点详解 文章目录 1 python的输入输出 重新认识 hello world 重回那个激情燃烧的岁月 1 1 输出函数print的规则