除了加减乘除外,还有
//
%
**
Python是弱类型语言,定义变量不需要指定类型
格式化字符串 | 含义 |
---|---|
%s | 字符串 |
%d | 有符号十进制数,%06d表示输出的整数显示位数,不足的地方使用0补全 |
%f | 浮点数,%.02f表示小数点后只显示两位 |
%% | 输出% |
Python中函数的参数传递以及返回值都是靠引用传递的
引用的概念
在python
中
id()
函数可以查看变量总保存数据所在的内存地址如果变量已经被定义,当给一个变量赋值时,变量改为对新赋值的数据引用
int
,bool
,float
,complex
,long(2.x)
str
tuple
list
dict
key
只能使用不可变类型的数据注意
Python
中内置有一个函数叫hash(o)
哈希
是一种算法,其作用就是提取数据的特征码(指纹)
Python
中,设置字典的键值对时,会首先对key
进行hash
已决定好在内存中如何保存数据,以方便后续对字典的操作:增删改查
key
必须是不可改变类型数据value
可以是任意类型的数据函数不能直接需修改全局变量的引用——使用赋值语句修改全局变量的值
如何在函数内部修改全局变量的值
global
进行声明全局变量定义的位置
全局变量命名的建议
g_
或者gl_
前缀在开发中,如果希望给函数添加注释,应该在定义函数的下方,使用连续的三对引号
在连续的三对引号之间编号对函数的说明文字
def multiple_table():
"""九乘九,乘法表"""
在函数调用位置,使用快捷键ctrl+Q
可以查看函数的说明信息
因为函数体相对比较独立,函数定义的上放,应该和其他代码(包括注释)保留两个空行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bdn4eNqC-1615807570855)(/images/python_1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uV7AYnvD-1615807570856)(/images/python_2.png)]
如对列表的排序
list_1.sort()
list_2.sort(reverse=True)
指定函数的缺省函数
定义函数时,在参数列表中直接指定即可
如:print_info(name,gender=True):
缺省参数的注意事项
有时可能需要一个函数能够处理的参数个数是不确定的,这时候就可以使用多值参数
python
中有两种多值参数
*
可以接收元组*
可以接收字典一般在给多值参数命名时,习惯使用以下两个名字
*args
——存放元组参数
arguments
缩写**kwargs
——存放字典参数
keyword
缩写示例
def func(*args,**kwargs):
print(args)
print(kwargs)
func(1,2,3,name='yfx',age=22)
def func(*args,**kwargs):
print(args)
print(kwargs)
gl_nums=(1,2,3)
gl_dict={'name':'yfx','age':23}
func(*gl_nums,**gl_dict)
模块是Python程序架构的 一个核心概念
import 模块名1,模块名2
提示:在导入模块时,每个导入应该独占一行
import 模块名1
import 模块名2
如果模块名过长,可以使用
as
指定模块的别名
注意,模块别名应该使用大驼峰命名法
from..import
模块名.
注意,如果两个模块存在同名函数,那么后导入模块的函数,会覆盖掉先导入的函数
as
关键词,给其中一个工具起一个别名不需要使用模块名.
,但是易发生重名冲突
这种方式不推荐,因为函数重名并没有任何的提示,出现问题不好排查
python的解释器在导入模块时,会:
在开发时,给文件起名,不要和系统的模块文件重名!
python中的每一个模块都有一个内置属性_file_
可以查看模块的完整路径
实际开发场景中
__name___属性
__name__
属性可以做到,测试模块的代码,只在测试情况下被运行,而在被导入时,不会执行!__name__
是python的一个内置属性,记录着一个字符串__name__
就是模块名__name__
就是__main__
在很多python
文件中都会看到以下格式的代码
# 导入模块
# 定义全局变量
# 定义类
# 定义函数
# 在代码下方
def main():
#...
pass
# 根据__name__判断是否执行以下代码
if __name__ == "__main__":
# 测试代码
此时测试代码,在本模块被import后不会执行
概念
好处
import 包名
可以一次性导入包中所有的模块__init_——。py
中指定对外界提供的模块列表 # 从当前目录 导入 模块列表
from . import send_message
from . import receive_message
建议百度,不同平台不一样
尽管python的列表可以存储不同类型的数据,但是在开发中,更多的应用场景是列表存储相同类型的数据
定义一个列表: list01=[]
输入list.
按下TAB
键,ipython会提示列表能够使用的方法
分类 | 关键字/函数/方法 | 说明 |
---|---|---|
增加 | insert(索引,数据) | 指定位置插入数据 |
append(数据) | 末尾追加数据 | |
extend(列表2) | 将列表2的数据追加到列表 | |
修改 | 列表[索引]=数据 | |
删除 | del 列表[索引] | 删除指定索引的数据 |
remove[数据] | 删除第一个出现的指定数据 | |
pop | 删除末尾数据 | |
clear | 清空列表 | |
统计 | len(列表) | 列表长度 |
列表.count(数据) | 数据在列表中出现的次数 | |
排序 | sort() | 升序排序 |
sort(reverse=True) | 降序排序 | |
reverse() | 逆序,反序 | |
索引 | .index(数据) | 查找数据所在的索引 |
for name in list_:
print(name)
Tuple
元组与列表类似,不同之处在于元组不能修改
tuple01=(5,)
()
本质上就是一个元组list
函数可以把元组转换为列表tuple
函数可以把列表转换为元组可以省略括号
接收时可以写成
def func():
return 1,2
a,b=func()
dictionary
(字典)是除列表以外python
之中最灵活的数据类型物体
的相关信息{}
来定义,
分隔
key
是索引value
是数据:
分隔键
只能使用字符串、数字或元组dict[键]
len
dict.update(新的字典)
dict.clear()
在实际开发中,由于字典中每一个键值对保存数据的类型是不同的,所以针对字典的循环遍历需求并不是很多
方法:for循环遍历键,通过键找到值
len
count(字符串)
统计小字符串在大字符串中出现的次数index(字符串)
某一个子字符串出现的位置方法 | 说明 |
---|---|
string.isspace() | 如果string中只包含空格(包括\n\t\r),则返回True |
string.isalnum() | 如果string至少有一个字符并且所有字符都是字母或数字,返回True |
string.isalpha() | 判断是否全是字母 |
isdecimal() | 判断是否只包含数字,全角数字 |
isdigit() | 判断是否只包含数字,全角数字,(1),\u00b2 |
isnumeric() | 判断是否只包含数字,全角数字,汉字数字 |
istitle() | 判断是否是标题化字符串(每个单词首字母大写) |
islower() | 至少包含一个区分大小写的字符,并且都是小写 |
isupper() | 至少包含一个区分大小写的字符,并且都是大写 |
方法 | 说明 |
---|---|
startswith(str) | 是否以str开头 |
endswith(str) | 是否以str结尾 |
find(str,start=0,end=len(string)) | 检测str是否包含在string中,如果start和end指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 |
rfind() | 从右边开始查找 |
index() | 与find类似,不过str不在string中会报错 |
rindex() | 从右边开始查找 |
replace(old_str,new_str,num=string.count(old)) | 把string中的old_str替换成new_str,如果num指定,则替换不超过num次 |
方法 | 说明 |
---|---|
ljust(width) | 左对齐,ctrl+Q 查看具体用法 |
rjust(width) | 右对齐 |
center(width) | 居中 |
方法 | 说明 |
---|---|
capitalize() | 第一个字符大写 |
title() | 每个单词首字母大写 |
lower() | |
upper() | |
swapcase() | 大小写翻转 |
方法 | 说明 |
---|---|
lstrip() | 裁掉左边开始的空白字符 |
rstrip() | 裁掉右边开始的空白字符 |
strip() | 裁掉两边的空白字符 |
方法 | 说明 |
---|---|
partition(str) | 将string分成str前面,str,str后面三部分 |
rpartition(str) | 同上,不过从右边开始查找 |
split() | |
splitlines() | 按照\r \n \r\n分隔 |
string.join(seq) | 以string作为分隔符,将seq中所有的元素(的字符串表示)合并为一个新的字符串 |
str[-1::-1]
或者str[::-1]
内置函数:无需import可以直接使用的函数
函数 | 描述 | 备注 |
---|---|---|
len(item) | 计算容器中元素个数 | |
del(item) | 删除扮靓 | del有两种方式 |
max(item) | 返回容器中元素最大值 | 如果是字典,只针对key比较 |
min(item) | 返回容器中元素最小值 | 如果是字典,只针对key比较 |
cmo(item1,item2) | 比较两个值,-1小于/0等于/1大于 | python3取消了cmp函数 |
注意
切片是左闭右开的
字典是无序的,不能进行切片
list1=[1,2,3]
list1+[4,5]和list1.extend([4,5])的区别是
extend改变了list1,而`+`返回新的list
list1.append(6)
list1.append([7,8])
list1=[1,2,3,4,5,6,[7,8]]
in
和not in
对字典使用时,针对的是键
for 变量 in 集合:
循环体代码
else:
for循环完整地执行完成后(没有中途break),执行else语句代码
GoodPerson
dir
dir
传入标识符/数据,可以查看对象内的所有属性和方法由哪一个对象调用的方法,方法内部的self就是哪个对象的引用(类似C++/Java的this)
self
就表示当前调用方法的对象自己self
参数self
访问对象属性self
,调用其他对象的方法tom.name='TOM'
init
_init_
方法,该方法是对象的内置方法
_init_
方法是专门用来定义一个类具有哪些属性的方法!
def __init__(self,name,age):
self.name=name
self.age=age
def show(self):
print('My name is %s'%self.name)
print('My age is %s'%self.age)
_del_
方法
_del_
方法_str_
方法
身份运算符用于比较两个对象的内存地址是否一直(即是否是同一个对象的引用)
Python
中针对None
比较时,建议使用is
判断
is
is not
is
和==
的区别
is
用于判断两个变量引用对象是否是同一个==
用于判断引用变量的值是否相等在日常开发中,不要使用这种方式,访问对象的私有属性或私有方法
在Python中,没有真正意义的私有
_类名
=>_类名__名称
(前面一个杠,后边两个杠)写法:class Dog(Animal):
重写父类方法有两种情况
覆盖父类的方法
对父类方法进行扩展
在需要的位置使用super().父类方法
来调用父类方法的执行
class Cat(Animal):
def eat(self):
super().eat()
print("Cat is eating !")
super()
就是使用父类创建出来的对象
class 子类名(父1,父2...)
Python中针对类提供了一个内置属性__mro__
,可以查看方法搜索顺序
MRO是method resolution order
,主要用于在多继承时判断方法,属性的调用路径
class A:
pass
class B:
pass
class C(A,B):
pass
print(C.__mro__)
结果:
(, , , )
object
是python中为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir
函数查看
新式类
:以object
类为基类的类,推荐使用经典类
:不以object
类为基类的类,不推荐使用object
class A(object):
多态不同的子类对象调用相同的父类方法,产生不同的执行结果
Python中一切皆对象
Python
中,类是一个特殊的对象——类对象例如:
class Group:
count = 0
def __init__(self):
Group.count += 1
访问类属性有两种方式
对象.类属性=值
,只会给对象添加一个属性,而不会影响类属性的值类方法语法如下
class Person:
@classmethod
def work(cls):
print("Working now")
class Cat:
@staticmethod
def run():
print("running now!")
Cat.run()
使用类名()
创建对象时,python解释器会先调用__new__
方法为对象分配空间
__new__
是一个由object
基类提供的内置静态方法,主要作用由两个:
python解释器获得对象的引用后,将引用作为第一个参数,传递给__init__
方法
重写__new__方法的代码非常固定
重写__new__
方法一定要 return super().__new__(cls)
否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
注意:__new__
是一个静态方法,在调用时需要主动传递cls
参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POpScgrh-1615807570858)(/images/python_3.png)]
class MusicPlayer(object):
instance=None
# 初始化动作记录
init_flag=False
def __new__(cls, *args, **kwargs):
if MusicPlayer.instance is None:
cls.instance=super().__new__(cls)
return cls.instance
def __init__(self):
if MusicPlayer.init_flag:
return
MusicPlayer.init_flag=True
print("初始化播放器")
try:
尝试执行的代码
except:
出现错误的处理
try:
num=int(input("Enter a num:"))
result=8/num
print("result is %.1f"%result)
except ZeroDivisionError:
print("除0错误!")
except ValueError:
print("输入数字有误!")
try:
num=int(input("Enter a num:"))
n=8/num
print("result is %.1f"%n)
except ValueError:
print("输入数字有误!")
except Exception as result:
print("未知错误%s"%result)
try:
pass
except 错误类型1:
pass
except (错误类型2,错误类型3):
pass
except Exception as result:
print(result)
else:
没有异常时,执行的代码
finally:
无论是否出现异常,都会执行的代码
提示
def func1():
return 8/int(input("ENter a num:"))
def func2():
print(func1())
try:
func2()
except Exception as abc:
print("错误类型:%s"%abc)
在开发中,除了代码执行出错,python解释器会抛出异常之外
还可以根据应用程序特有的业务需求主动抛出异常
案例:
def input_password():
pwd = input("输入密码")
pwd_len = len(pwd)
if pwd_len < 8:
ex=Exception("密码少于8位")
raise ex
return pwd
try:
print(input_password())
except Exception as result:
print("发生错误!错误类型:%s" % result)
在计算机中要操作文件的套路非常固定,一共三个步骤
在python中要操作文件需要记住1个函数和3个方法
序号 | 方法 | 说明 |
---|---|---|
1 | open | 打开文件,并且返回文件操作对象 |
2 | read | 将文件内容读取到内存 |
3 | write | 将指定内容写入文件 |
4 | close | 关闭文件 |
open
函数负责打开文件、并且返回文件独享
read/write/close
三个方法都需要通过文件对象来调用
提示
文件指针
read
方法后,文件指针会移动到读取内容的末尾
思考
read
方法,读取了所有内容,那么再次调用read
方法,还能得到内容吗?
语法如下:
f=open("文件名",“访问方式”)
访问方式 | 说明 |
---|---|
f | 以只读方式打开文件。默认方式 |
w | 以只写方式打开文件。如果文件存在会被覆盖。文件不存在,则创建新文件 |
a | 以追加方式打开文件。文件不存在,则创建新文件 |
r+ | 以读写方式打开文件。文件不存在,则抛出异常 |
w+ | 以读写方式打开文件。文件存在,则被覆盖。文件不存在,则创建新文件 |
a+ | 以读写方式打开文件。文件存在,则指针放结尾。不存在,则创建新文件。 |
提示:
readline方法
readline
方法可以一次读取一行内容读取大文件的正确姿势
# 打开文件
file = open("D:\\new.txt")
while True:
# 读取一行内容
text = file.readline()
# 判断是否读取到内容
if not text:
break
# 每读取一行的末尾已经有了一个'\n'
print(text, end="")
# 关闭文件
file.close()
复制文件案例
file1=open("file1.txt")
file2=open("file2.txt","w")
while True:
text=file1.readline()
if not text:
break
file2.write(text)
file2.close()
file1.close()
python
中,如果希望实现上述功能,需要导入os
模块文件操作
序号 | 方法名 | 说明 | 示例 |
---|---|---|---|
1 | rename | 重命名文件 | os.rename(源文件名,目标文件名) |
2 | remove | 删除文件 | os.remove(文件名) |
目录操作
序号 | 方法名 | 说明 | 示例 |
---|---|---|---|
1 | listdir | 目录列表 | os.listdir(目录名) |
2 | mkdir | 创建目录 | os.mkdir(目录名) |
3 | rmdir | 删除目录 | os.rmdir(目录名) |
4 | getcwd | 获取当前目录 | os.getcwd() |
5 | chdir | 修改工作目录 | os.chdir(目标目录) |
6 | path.isdir | 判断是否是文件 | os.path.isdir(文件路径) |
提示:文件或者目录操作都支持相对路径和绝对路径
# *-* codeing:utf-8 *-*
# coding=utf-8
utf-8
字符,涵盖了地球上几乎所有地区的文字utf-8
是UNICODE
编码的一种编码格式evaluate:评估的缩写
eval()
函数十分强大——将字符串当成有效的表达式来求值,并返回计算结果
# 基本的数学计算
result=eval("2*3+1")
print(result)
# 字符串重复
str="'#'*10"
print(eval(str))
# 将字符串转换成列表
str="[1,2,3,4,5]"
print(type(eval(str)))
# 将字符串转换成字典
str="{'name':'xiaoming','age':18}"
print(type(eval(str)))
在开发时千万不要使用
eval
直接转换input
的结果
用户可以通过输入__import__('os').system('ls')
等,对系统发出命令!
等价于
import os
os.system("终端命令")
id()
可以查看内存地址
可以将None
赋值为任何一个变量
随机数
函数调用不能放在函数定义之前,因为python是解释型语言,一行一行执行的
Pycharm中F8 Step Over
可以单步执行,会把函数调用看作一行代码直接执行
F7 Step into
可以单步执行代码,如果是函数会进入函数内部pyc
文件:
compiled
编译过的意思# todo注释
提示自己有什么活还没干
返回值是元组时,省略小括号
列表变量调用+=
本质上是在执行列表变量的extend
方法,不会修改变量的引用p
+=
不会影响外界数据,但是列表的+=
会影响x5python能够自动将一对括号内部大的代码连接在一起,可以放心换行
python占位符pass,无意义,用来暂时保证程序不报错
object是所有类的基类
join(列表、字典、元组)
将序列中的元素以指定的字符连接生成一个新的字符串
要求列表…中是字符串
list1=["1","2","3","4"]
str1=",".join(list1)
print(str1)
list2=[1,2,3,4]
str2=",".join(str(n) for n in list2)
print(str2)