Python入门

一、Python介绍与安装

二、Python基本语法

三、Python数据类型

Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。

1、基本数据类型

下面介绍一下 python3 中常见的数据类型:

# number
a, b, c = 1, 2.22, 1+2j
print(type(a), type(b), type(c))

# 字符串
name = "小李"
print(name)

# bool
isDel = True
print(isDel)

# 列表
total = [1, 2, 3.33, 5, 7, 'hhh']
# r 转义特殊符号
str1 = r'1231\414'

total[1] = 'c1'
print(total)
print("2 / 4 = " + str(2 / 4))
# 从第一个字符到第四个
print(str1[0:4])

# 元组
tupleTest = (1, 2.1, 'snow', [4, 5, 6])
'''
元组无法修改,会报错 TypeError: 'tuple' object does not support item assignment
tupleTest[0] = 2 
但是元组中的列表可以修改
'''
tupleTest[-1][0] = 7
print(tupleTest)

# 集合(自动去重)
setTest = {"111", 3.33, 111, 3.33, 4.56}
print(setTest)

# 字典(键值对)
dictTest = {1: "value1", 2: "value2", 3: "value3"}
print("获取所有的键:", dictTest.keys())
print("key 1的值为" + dictTest[1])
Number(数字)
String(字符串)
Bool(布尔类型)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)

2、数据类型分类

python中数据类型可分为可变类型不可变类型

  • 不可变类型:一旦创建,就不能修改其值。常见的不可变类型包括数字(Number)、布尔值(bool)、字符串(str)、元组(tuple) 等。当我们重新赋值时。相当于新创建了一个对象。

  • 可变类型:创建后可以修改其值。常见的可变类型包括列表(list)、集合(set)、字典(dict)等。

# 不可变类型
a = 5
b = "Hello, world!"
c = (1, 2, 3)

# 尝试修改不可变类型
a = 6  # 修改整数类型
b = "Goodbye, world!"  # 修改字符串类型
c[0] = 4  # 尝试修改元组类型,会报错 TypeError: 'tuple' object does not support item assignment

# 可变类型
lst = [1, 2, 3]
s = {1, 2, 3}
d = {"name": "Tom", "age": 18}

# 修改可变类型
lst[0] = 4  # 修改列表类型
s.add(4)  # 修改集合类型
d["age"] = 19  # 修改字典类型

3、数据类型转换

Python中的类型转换分为两种:显示转换、隐式转换

类型获取及判断

我可以可以使用下面两种方式来获取数据的类型并进行判断:

  • type() 函数
    可以返回一个对象的类型。
a, b, c = 1, 2.22, 1+2j
# 打印结果:<class 'int'> <class 'float'> <class 'complex'>
print(type(a), type(b), type(c))
  • isinstance() 函数
    可以判断一个对象是否为指定类型。
a, b, c = 1, 2.22, 1+2j
isEquals = isinstance(a, int)
# 打印结果:True
print(isEquals)

type 函数 和 isinstance 函数区别:

type() 函数只能判断对象的实际类型,而 isinstance() 函数可以判断对象是否为指定类型或其子类的实例。

隐式类型转换

在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要我们去干预。

比如一个浮点数与整数相加,结果会自动转为浮点数,因为浮点数的数据大一些。

# 隐式转换
num1 = 1.233
num2 = 2
result = num1 + num2
print(type(result))
显示类型转换

在显式类型转换中,用户可以将对象的数据类型转换为所需的数据类型。 我们使用 int()float()str() 等预定义函数来执行显式类型转换。

# 如果直接与字符类型相加会报错:unsupported operand type(s) for +: 'int' and 'str'
num3 = 1
str3 = "4"
str_result = num3 + str3
print(str_result)

# 可以通过函数进行强制转换
str_result = num3 + int(str3)

四、条件判断

条件判断就是可以通过表达式的结果(True 或 False)决定要执行的代码块。

1、if

基本语法为:if...elif...else,elif 可以有多个,并且 if 可以进行嵌套。

gender = int(input("请输入数字:"))
if gender == 0:
    print("男")
elif gender == 1:
    print("女")
else:
    print("未知")

2、match...case

# python 3.10及以后版本支持
# case _ 表示匹配所有
match gender:
    case 1:
        print("男生")
    case 2:
        print("女生")
    case _:
        print("未知")

五、循环语句

Python 中的循环语句有 for 和 while。

1、for循环

for 循环语法结构如下:

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

使用 for 循环遍历一个列表

# for 循环
sites = ["baidu", "google", "taobao", "ali"]
for site in sites:
    print(site)

2、while循环

while 循环语法结构如下

while 判断条件:
    执行语句……

我们测试一下

# while 循环
a = 1
while a != 0:
    num = int(input("请输入数字:"))
    print(num)
    if num == 0:
        a = 0
else:
    print("退出代码:"+str(a))

3、break 和 continue 语句

  • break:表示跳出整个循环
  • continue:表示跳出当前循环,执行下一次循环
# for 循环
sites = ["baidu", "google", "taobao", "ali"]
for site in sites:
    if site.__eq__("baidu"):
        # 等于 baidu 时退出本次循环,执行下一次
        continue
		
    print(site)
	
    if site.__eq__("taobao"):
        # 等于 taibao 时,直接退出循环
        break

六、推导式

# 列表推导式
names = ["zhangsan", "lisi", "wnagwu", "zhaoliu"]
# 将列表中名称长度大于4的数据存储到新的列表中
new_names = [name.upper() for name in names if len(name) > 4]
print(new_names)

# 字典推导式
# 使用列表中字符串作为键,加上值创建一个字典
new_dict = {key: 18 for key in new_names}
print(new_dict)

# 集合推导式
# 判断不是abcd的字母并输出
a = {x for x in 'abcdefcasdfzbcd' if x not in 'abcd'}
print(a)

# 元组推导式
# 元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 []
# 并且元组推导式返回的结果是一个生成器对象 generator 类型。
b = (x for x in range(1, 10) if x % 2 == 0)
print(tuple(b))

七、函数

函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。也可以自己自定义函数。

1、函数定义与调用

自定义函数语法结构如下:

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

定义一个函数并调用

# 计算两数之和
def sum_num(a, b):
    return a + b

# 调用函数
print(sum_num(2, 2))

2、参数类型

python 中参数分为下面几种类型:

  • 必需参数
    必需参数表示必须得以正确的顺序传入函数。并且调用时的数量必须和声明时的一样。
def print_str(name):
    print(name)

# 调用时必须传入参数,否者报错:TypeError: print_str() missing 1 required positional argument: 'name'
print_str()
  • 关键字参数
    关键字参数表示我们可以在调用时,直接通过对应的参数名称来传递参数,可以不按照方法定义的参数顺序来传递。
def printinfo(name, age):
    print ("名字: ", name)
    print ("年龄: ", age)


#调用printinfo函数
printinfo(age=50, name="Snow")
  • 默认参数
    如果我们定义了默认参数,当此参数没有传递时,就会使用默认的参数值。
def printinfo(name, age=18):
    print("名字: ", name)
    print("年龄: ", age)


#调用printinfo函数
printinfo(name="Snow")
  • 不定长参数
    跟我们 java 中的可变参数类型,使用 * 可以接受我们传递的多个参数。
    一个星号表示传递的参数使用元组接受,两个星号表示传递的多个参数使用字典接受
def printinfo(arg1, *vartuple):
    print(arg1)
    for var in vartuple:
        print(var)


# 调用printinfo 函数,可以只传递第一个参数,也可以传递多个参数
printinfo(10)
printinfo(70, 60, 50)

def printinfo( arg1, **vardict ):
    print ("输出: ")
    print (arg1)
    print (vardict)

# 结果为:
# 1
# {'a': 2, 'b': 3}
printinfo(1, a=2,b=3)

3、参数传递

与 java 中的值传递和引用传递类似。

当我们函数方法中的参数为不可变类型时,并不会修改传进去的参数的值。而当我们使用 可变类型时,可以修改传递进来的值。

我们可以通过下面两个例子来理解一下;

# 不可变类型如:整数、字符串、元组
def param_change(a):
    print(id(a))
    a = 10
    print(id(a))

# 调用结果如下,可以看出最后修改后的a的地址不是我们原始传递进去的a:
# 140703324431144
# 140703324431144
# 140703324431432
a = 1
print(id(a))
param_change(a)


# 可变类型如:列表、集合、字典等
def changeme(my_list):
    my_list[0] = 11


# 调用结果如下,可以看出方法执行后地址还是同一个,但是值改变了:
# [33, 44, 55, 66] 2732550542720
# [11, 44, 55, 66] 2732550542720
my_list = [33, 44, 55, 66]
print(my_list, id(my_list))
changeme(my_list)
print(my_list, id(my_list))

4、匿名函数

匿名函数使用 lambda 来实现,lambda 只是一个表达式,函数体比 def 简单很多。

基本语法结构如下:
lambda [arg1 [,arg2,.....argn]]:expression

使用匿名函数实现两数相加

lambda_sum = lambda a, b: a + b
print(lambda_sum(1,2))

八、文件操作

1、open 方法

python 中使用 open() 方法打开一个文件,并返回一个文件对象。

  • 基本语法结构如下
open(filename, mode)
  • 完整的语法格式为
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • 参数
    filename:访问文件的路径名称。
    mode:打开文件的模式:只读,写入,追加等。
    buffering: 设置缓冲
    encoding: 一般使用utf8
    errors: 报错级别
    newline: 区分换行符
    closefd: 传入的file参数类型
    opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

mode 可选值如下图:
image

下面是一个简单读写文件例子:

注意:使用完成后一定不要忘记关闭这个文件。

# 打开一个文件,可以通过 mode 参数设置是否可以读写、覆盖等操作
file1 = open("D:/Snow/filetest.txt", "w+")

# 判断文件是否可写
if file1.writable():
    print("进行写操作")
    file1.write("你好吗\n")
    file1.write("让自己开心一点\n")
    # 将文件指针定位到文件开头,然后读取文件
    file1.seek(0)
    print(file1.read())
else:
    print("不可进行写操作")

# 也可使用 r 类型的 mode 进行读操作
file2 = open("D:/Snow/filetest.txt", "r+")
str1 = file2.readline()
print(str1)
file2.close()

下面的写法会自动关闭文件对象

with open("file.txt", "r") as file:
    content = file.read()
    # 在代码块中进行文件读取和其他操作

# 在这个位置,文件已经自动关闭

2、常用方法

下面介绍一些 file 对象的常用方法

方法名 描述
file.close() 关闭文件。关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,将内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.read(size) 读取文件内容,size 是一个可选的数字类型的参数。 当 size 为空或者为负, 读取所有内容
file.readline() 读取文件内容的一行
file.write(str) 将字符写入到文件中,返回写入的字符数
file.writable() 判断文件是否可以写入
file.tell() 返回当前位置前的所有字节数
file.seek() 改变文件指针位置,0 表示开头, 1 表示当前位置, 2 表示文件的结尾

九、面向对象

我们可以看一个简单的类

class MyClass:
    name = 'snow'
    age = 24

    def my_info(self):
        print("姓名:"+self.name + ",年龄:{}".format(self.age))


me = MyClass()
me.my_info()

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

类中有很多 Python 内置的方法,前后都有两个下划线,如:__init__,初始化构造函数

对象

当我们创建一个类的实例时,我们称之为对象或实例。上面例子中的 me 就是一个对象。

属性

类中定义的变量称为属性,python 中可以不需要实例化,直接通过类名来调用属性。

使用一个或两个下划线开头,表示声明该属性为私有,不能在类的外部被使用或直接访问。

如:__name

方法

python中的方法使用 def 关键字来定义,方法必须使用类对象来调用。

方法与属性一致,也可以使用一个或两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。

posted @ 2023-06-28 10:32  香酥豆腐皮  阅读(31)  评论(0编辑  收藏  举报
正在加载今日诗词....