重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、print()函数:打印字符串;
白云ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
2、raw_input()函数:从用户键盘捕获字符;
3、len()函数:计算字符长度;
4、format()函数:实现格式化输出;
5、type()函数:查询对象的类型;
6、int()函数、float()函数、str()函数等:类型的转化函数;
7、id()函数:获取对象的内存地址;
8、help()函数:Python的帮助函数;
9、s.islower()函数:判断字符小写;
10、s.sppace()函数:判断是否为空格;
11、str.replace()函数:替换字符;
12、import()函数:引进库;
13、math.sin()函数:sin()函数;
14、math.pow()函数:计算次方函数;
15、os.getcwd()函数:获取当前工作目录;
16、listdir()函数:显示当前目录下的文件;
17、time.sleep()函数:停止一段时间;
18、random.randint()函数:产生随机数;
19、range()函数:返回一个列表,打印从1到100;
20、file.read()函数:读取文件返回字符串;
21、file.readlines()函数:读取文件返回列表;
22、file.readline()函数:读取一行文件并返回字符串;
23、split()函数:用什么来间隔字符串;
24、isalnum()函数:判断是否为有效数字或字符;
25、isalpha()函数:判断是否全为字符;
26、isdigit()函数:判断是否全为数字;
27、 lower()函数:将数据改成小写;
28、upper()函数:将数据改成大写;
29、startswith(s)函数:判断字符串是否以s开始的;
30、endwith(s)函数:判断字符串是否以s结尾的;
31、file.write()函数:写入函数;
32、file.writeline()函数:写入文件;
33、abs()函数:得到某数的绝对值;
34、file.sort()函数:对书数据排序;
35、tuple()函数:创建一个元组;
36、find()函数:查找 返回的是索引;
37、dict()函数:创建字典;
38、clear()函数:清楚字典中的所有项;
39、copy()函数:复制一个字典,会修改所有的字典;
40、 get()函数:查询字典中的元素。
…………
Python中有许多内置函数,不像print、len那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性
Counter
collections在python官方文档中的解释是High-performance container datatypes,直接的中文翻译解释高性能容量数据类型。这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。在python3.10.1中它总共包含以下几种数据类型:
容器名简介
namedtuple() 创建命名元组子类的工厂函数
deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counter 字典的子类,提供了可哈希对象的计数功能
OrderedDict 字典的子类,保存了他们被添加的顺序
defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict 封装了字典对象,简化了字典子类化
UserList 封装了列表对象,简化了列表子类化
UserString 封装了字符串对象,简化了字符串子类化
其中Counter中文意思是计数器,也就是我们常用于统计的一种数据类型,在使用Counter之后可以让我们的代码更加简单易读。Counter类继承dict类,所以它能使用dict类里面的方法
举例
#统计词频
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
result = {}
for fruit in fruits:
if not result.get(fruit):
result[fruit] = 1
else:
result[fruit] += 1
print(result)
#{'apple': 2, 'peach': 3, 'lemon': 1}下面我们看用Counter怎么实现:
from collections import Counter
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
c = Counter(fruits)
print(dict(c))
#{'apple': 2, 'peach': 3, 'lemon': 1}显然代码更加简单了,也更容易阅读和维护了。
elements()
返回一个迭代器,其中每个元素将重复出现计数值所指定次。元素会按首次出现的顺序返回。如果一个元素的计数值小于1,elements()将会忽略它。
c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']most_common([n])
返回一个列表,其中包含n个最常见的元素及出现次数,按常见程度由高到低排序。如果n被省略或为None,most_common()将返回计数器中的所有元素。计数值相等的元素按首次出现的顺序排序:
Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]这两个方法是Counter中最常用的方法,其他方法可以参考 python3.10.1官方文档
实战
Leetcode 1002.查找共用字符
给你一个字符串数组words,请你找出所有在words的每个字符串中都出现的共用字符(包括重复字符),并以数组形式返回。你可以按任意顺序返回答案。
输入:words = ["bella", "label", "roller"]
输出:["e", "l", "l"]
输入:words = ["cool", "lock", "cook"]
输出:["c", "o"]看到统计字符,典型的可以用Counter完美解决。这道题是找出字符串列表里面每个元素都包含的字符,首先可以用Counter计算出每个元素每个字符出现的次数,依次取交集最后得出所有元素共同存在的字符,然后利用elements输出共用字符出现的次数
class Solution:
def commonChars(self, words: List[str]) - List[str]:
from collections import Counter
ans = Counter(words[0])
for i in words[1:]:
ans = Counter(i)
return list(ans.elements())提交一下,发现83个测试用例耗时48ms,速度还是不错的
sorted
在处理数据过程中,我们经常会用到排序操作,比如将列表、字典、元组里面的元素正/倒排序。这时候就需要用到sorted(),它可以对任何可迭代对象进行排序,并返回列表
对列表升序操作:
a = sorted([2, 4, 3, 7, 1, 9])
print(a)
# 输出:[1, 2, 3, 4, 7, 9]对元组倒序操作:
sorted((4,1,9,6),reverse=True)
print(a)
# 输出:[9, 6, 4, 1]使用参数:key,根据自定义规则,按字符串长度来排序:
fruits = ['apple', 'watermelon', 'pear', 'banana']
a = sorted(fruits, key = lambda x : len(x))
print(a)
# 输出:['pear', 'apple', 'banana', 'watermelon']all
all() 函数用于判断给定的可迭代参数iterable中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False外都算True。注意:空元组、空列表返回值为True。
all(['a', 'b', 'c', 'd']) # 列表list,元素都不为空或0
True
all(['a', 'b', '', 'd']) # 列表list,存在一个为空的元素
False
all([0, 1,2, 3]) # 列表list,存在一个为0的元素
False
all(('a', 'b', 'c', 'd')) # 元组tuple,元素都不为空或0
True
all(('a', 'b', '', 'd')) # 元组tuple,存在一个为空的元素
False
all((0, 1, 2, 3)) # 元组tuple,存在一个为0的元素
False
all([]) # 空列表
True
all(()) # 空元组
Trueany函数正好和all函数相反:判断一个tuple或者list是否全为空,0,False。如果全为空,0,False,则返回False;如果不全为空,则返回True。
F-strings
在python3.6.2版本中,PEP 498提出一种新型字符串格式化机制,被称为 “字符串插值” 或者更常见的一种称呼是F-strings,F-strings提供了一种明确且方便的方式将python表达式嵌入到字符串中来进行格式化:
s1='Hello'
s2='World'
print(f'{s1} {s2}!')
# Hello World!在F-strings中我们也可以执行函数:
def power(x):
return x*x
x=4
print(f'{x} * {x} = {power(x)}')
# 4 * 4 = 16而且F-strings的运行速度很快,比传统的%-string和str.format()这两种格式化方法都快得多,书写起来也更加简单。
本文主要讲解了python几种冷门但好用的函数,更多内容以后会陆陆续续更新~
pandas官方文档:
对常用函数做了汇总,每个函数的参数可能不是全的,但是常用的,不常用的没总结,如有问题,请不吝赐教,谢谢!
1、创建Series
通用函数:pd.Series(values,index)
1)pd.Series([1,2,3],index=[‘a’,‘b’,‘c‘])
2)pd.Series(np.array([1,2,3]),index=[‘a’,‘b’,‘c‘])
3)pd.Series({ 'a':1, 'b':2, 'c':3})
Series转字典:Series.to_dict()
说明:Series的values参数是python中常见的一维数据类型。
2、属性
1)Series.values ---array([1,2,3])
Series的values是array类型
2)Series.index---index([‘a’,‘b’,‘c‘])
未指定index时,自动生成 0-(N-1)的整数索引,
指定 index时,使用指定索引。
3、Series的索引与切片
Series[0] / Series['a'] : Sereis可以位置索引或标签索引,也可以进行切片操作
1、创建DataFrame
1) 创建DataFrame的通用函数:
df = pd.DataFrame(values,index,columns)
pd.dataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['bj','sh','sz'])
pd.dataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns=['bj','sh','sz'])
pd.dataFrame('bj':[1,4,7],'sh':[2,5,8],'sz':[3,6,9],index=['a','b','c'])
说明:创建方法与Sries类似,Series的values参数是python中常见的一维数据类型,DataFrame的values参数是python中常见的二维数据类型。
2) 通过网页中复制数据快捷创建
import webbrowser
link = ''
webbrowser.open(link)
打开界面进行复制,将数据复制到粘贴板中
df = pd.read_clipboard() #从粘贴板中读取数据
3)通过Series创建DataFrame
df = pd.DataFrame([s1,s2,s3],columns=['bj','sh','sz'])
注意:单独的s1,s2,s3是纵向排列的的Series,但是在DataFrame中是横向排列的。
自己总结:Series除了打印出来是Series格式外,其他时候可以直接当作list来操作。
2、属性
1)df.columns
通过columns生成新的DataFrame
df_new = pd.DataFrame(df,columns=['x1','x2'])
或者df_new = df[['x1','x2']]
2)df.shape 显示行列数
3)df.head() 默认显示前5行
4)df.tail() 默认显示后5行
3、获取DataFrame的列
1)获取DataFrame某一列
df.x1或df['x1']:返回值是Series,可以理解为一个DataFrame是由多个Series组成的。
2) 获取DataFrame某几列
df_new = df[['x1','x2','x3']]
4、为某列赋值
1) df['x1'] = range(10)
2) df['x1'] = numpy.arange(10)
3) df['x1'] = pd.Series(np.arange(10))
说明:类似于创建Series
5、为某列对应的特定行重新赋值
df['x1'] = pd.Series([2,3],index=[0,1])
将列为x1,行索引为0和1的值改为2,3
6、获取DadaFrame的行
for row in DataFrame.iterrows():
print(row[0],row[1])
#每个row是一个元祖,包含2个元素,row[0]是整型索引,row[1]是Series,所以从行的角度也可以看出,一个DataFrame是由多个Series组成的。
7、DataFrame的转置
df_new = df.T
1、粘贴板的io
df = pd.read_clipboard()
df.to_clipboard()
2、csv的io
df.to_csv('xxx.csv')
df = pd.read_csv('xxx.csv')
3、json的io
df.to_json()
pd.read_json(df.to_json())
4、excel的io
df.to_excel('xx.xlsx')
df = pd.read_excel('xx.xlsx')
5、df = pd.read_sql('')
df.to_sql('')
1、iloc
sub_df = df.iloc[10:20,:] 选取DataFrame的10-20行,所有列数据
sub_df = df.iloc[10:20,0:2]
说明:iloc函数是位置索引,与索引的名字无关。
2、loc
sub_df = df.loc[10:20,:'movie_name']
说明:loc是标签索引,10,20,'movie_name' 都是索引名字,与位置无关。
1、Series.reindex(index=['x1','x2','x3'],fill_value=10)
将df重新索引,并且将NaN空值用10进行填充
2、Series.reindex(index=range(15),method='ffill')
前项填充,后面的值用前面的值进行填充
通过reindex想到,如果想新增一个空列或者空行,可以用reindex方法,同样地,想减少某些行或者某些列,也可以用reindex方法。
继reindex之后删除行列的函数操作
Series.drop('A') #删除'A'所对应的值
DataFrame.drop(label,axis)
label可以是行名也可以是列名,label是行的话axis是0,label是列的话axis是1。
** 删除行还可以用 del df['A']
nan是numpy的一种数据类型,np.nan,float类型
任何数据与nan的运算结果都是nan
1、nan in Series
Series.isnull() --返回value为True或者False的Series
Series.notnull() --返回value为True或者False的Series
Series.dropna() --返回删除nan值后的Series
Series.fillna(method='ffill') --前项插值,按照前面的值填充后面的空值
2、nan in DataFrame
df.isnull() --返回value为True或者False的DataFrame
df.notnull() --返回value为True或者False的DataFrame
df.dropna(axis=0/1,how='any/all',thresh=None)
说明:axis表示删除行为nan或者列为nan;
any表示只要有一个为空,all表示行中的每个元素或者列中的每个元素为空;
thresh是阈值的意思,表示某行或者某列nan的个数达到阈值的个数时才删除该行或该列。
df.fillna(value=1) ---所有的空值都填充为1
df.fillna(value={0:0,1:1,2:2}) ---将0列的空值填为0,1列的空值填为1,2列的空值填为2,默认为填充列
注意:fillna和dropna的特点,生成新的DataFrame,原来的DataFrame不变。
1、多重索引介绍
Series = pd.Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])
'1','2'为一级索引,'a','b','c'为二级索引
df 可以看做是索引的'1','2'的Series
Series['1'] --Series
Series['1']['a'] --value
Series[:,'a'] --选择'1'和'2'中的'a'对应的值
2、多重索引格式转为二维DataFrame
df = Series.unstack() --转为二维DataFrame
3、多重索引在DataFrame中的操作
1、 map函数与apply函数、applymap函数的区别:
1)map函数对Series中的每个元素作用;
2)applymap函数对DataFrame中的每个元素作用;
3)apply函数对对DataFrame和Series的一列做整体运算。
2、Series.replace(to_replace=[2,3,4],values=[20,30,40]) 替换Series中多个值
Series.replace({1:10,2:20}) 将索引为1的值替换为10,将索引为2的值替换为20
df.sum() --默认按照列进行求和,nan的值被忽略
df.min() --默认按照列求最小值
df.max() --默认按照列求最大值
df.mean() --默认按照列求平均值
df.describe() --默认按照列进行描述
df.sum(axis=1) --按行求和,nan的值被忽略
#axis=0表示对横轴进行操作,但是运算中表现为纵轴操作
#axis=1表示对纵轴进行操作,但是运算中表现为横轴操作
bins = [0,59,70,80,100],bins是分割范围
score_cat = pd.cut(Series,bins) ---得到catgory类型的数据
DataFrame的分箱技术很棒啊!
pd['catgory'] = pd.cut(df['a'],bins=[0,59,70,80,100],labels=['low','ok','good','great'])
--新增一列,将a列的值按照labels进行分类标记,good!!!
#生成长度为3的随机字符串 pd.util.testing.rands(3)
1、按照一列分组
g = df.groupby('city')
g是分组类型数据,打印不出来,所以看不到,但是有属性和方法可以间接的了解
1) g.groups --得到分的几个组,和每个组包含的索引
2)g.get_group('BJ') --得到'BJ'所对应的组
3)groupby = split +apply +combine
g.mean() --求每组的平均值
g.max() --求每组的最大值
g.min() --求每组的最小值
g.count()
g.describe()
4)g是一个可迭代对象,可以用list函数将其转化为list
list(g) -- [('组名1',DataFrame1),('组名2',DataFrame2),(),()]
dict(list(g)) --将其转化为字典
同时可以通过for循环进行遍历操作:for item,desc in g:print(item,desc)
#怪不得分组后不是DataFrame,因为元组的第一个元素是'分组名'。
2、按照多列分组
g_new = df.groupby(['city','wind'])
得到生成器((('分组1','分组2'),DataFrame),(),()...)
g_new.get_group(('分组1','分组2'))
for (name_1,name_2),group in g_new:
print((name_1,name_2),group)
g.mean() --求每组的平均值
与g.agg('mean')方法一样
pd.pivot_table(df,index=['',''],aggfuc='sum',values=['',''])
index是分组的组名,values是透视表呈现结果的列,columns是values下的分解
#感觉透视表呈现的结果就是groupby+agg后的结果
#分析者需要对数据结构有一定的了解
df.sort_values(by='',ascending=True/False)[:10] df可以索引
df.value_counts() --按值计数
df.['a'] = df['b'].apply(lambda x:x0) --DataFrame中的True/False
通过g.size()可以看到被groupby之后的数据,得到的是一个Series
1、Series的排序:
1)对值进行排序
Series.sort_values() ---直接对Series的值进行排序
2)通过索引进行排序
Series.sort_index()
#默认都是升序排列
2、DataFrame的排序
df.sort_values(by='') --按照某列的顺序进行排序
df['a'].sort_values() --返回对a列数据的排序结果,只返回a列
1、df.index = Series(['a','b','c']) 直接对index赋予新值
2、df.index = df.index.map(str.upper)
map函数中只传入新的函数名即可
3、df.rename(index=str.upper,columns=str.lower)
或者传递字典,进行一一转换
pd.merge(df1,df2,on=None,how='left/right/inner/outer')
pd.merge(df1,df2) --没有on参数默认先找相同的columns,然后在columns下找相同的values
pd.merge(df1,df2,on='columns') --on参数是指按照指定列进行merge
left:表示以左边的数据表为基准,进行填充右面的数据
right:表示以右边的数据表为基准,填充左边的数据
outer:以on的指定列的所有值为基准,填充两边的数据
inner:默认inner,相同on指定的columns下的相同values对应的左右两边的数据
1、concat拼接
pd.concat([Series1,Series2])
pd.concat([df1,df2]) -- 上下叠加,将没有的列进行填充
2、combine组合
Series1.combine_first(Series2) --用Series2的值去填充Series1中为空的值
df1.combine_first(df2) ---用df2将df1中的空值填充
df['A'] = df['A'].apply(str.upper) ---apply函数中也只输入函数名
len(df) --求df的长度
len(df['a'].unique()) --查看a列中不重复数据的多少
Series.duplicated() --返回一列True/False的Series
Series.drop_duplicates() --删除重复值
df.drop_duplicates('a',keep='first/last')
df.drop_duplicates() --删除完全重复的行
参数:'a'表示以a列为基准,删除重复值
first表示保留第一个,last表示保留最后一个
data_list = pd.date_range(start,end,period='D',freq)
period='D',以天为单位
freq = 'W' 以周为单位
freq = 'W-Mon'以每周一位单位
freq = '5H' 以5h为单位
以data_range作为索引提取数据比较简单
df[datetime(2017,9,1)]
df['2017-09-01']
df['20170901']
df['201709']
对时间序列数据进行分组聚合操作:
s1.resample('M').mean() --以月为单位进行采样,然后求每组的平均值
s1.resample('H').ffill() --前项填充
s1.resample('H').bfill() --后项填充
补充:1)jupyter中可以执行linux命令,太棒了!
!ls
!more xxx.csv
!pwd 等等
2)jupyter 查看函数帮助的快捷键:摁住shift + tab 棒!!!
python系统提供了下面常用的函数:
1. 数学库模块(math)提供了很多数学运算函数;
2.复数模块(cmath)提供了用于复数运算的函数;
3.随机数模块(random)提供了用来生成随机数的函数;
4.时间(time)和日历(calendar)模块提供了能处理日期和时间的函数。
注意:在调用系统函数之前,先要使用import 语句导入 相应的模块
该语句将模块中定义的函数代码复制到自己的程 序中,然后就可以访问模块中的任何函数,其方 法是在函数名前面加上“模块名.”。
希望能帮到你。
1
len(list)
列表元素个数
2
max(list)
返回列表元素最大值
3
min(list)
返回列表元素最小值
4
list(seq)
将元组转换为列表
序号
方法
1
list.append(obj)
在列表末尾添加新的对象
2
list.count(obj)
统计某个元素在列表中出现的次数
3
list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4
list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5
list.insert(index, obj)
将对象插入列表
6
list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7
list.remove(obj)
移除列表中某个值的第一个匹配项
8
list.reverse()
反向列表中元素
9
list.sort( key=None, reverse=False)
对原列表进行排序
10
list.clear()
清空列表
11
list.copy()
复制列表
在写python程序时,常能用到一些函数和方法,总结一下,保存起来,方便查询。
一、内置函数
# abs()获取数字绝对值
# chr(i)数字转换为字符类型
# divmod() 获取两个数值的商和余数
# enumerate() 将可遍历序列组合为索引序列
# float()转换为浮点数
# format() 格式化字符串
# int()转换为整数
# input() 接受用户输入内容
# len() 计算元素个数
# max() 返回最大值
# min() 返回最小值
# math.ceil() 返回指定数值的上舍整数
# open()打开文件并返回文件对象
# pow() 幂运算
# print()打印输出
# range() 生成器
# reversed()反转所有元素
# round()四舍五入求值
# sorted()对可迭代对象进行排序
# str() 转换为字符串
# sum() 求和
# set() 创建集合
# tuple() 将序列转换为元组
# zip()将可迭代对象打包成元组
二、方法
# append() 添加列表元素
# capitalize()首字母转换为大写
# count()字符出现次数
# close() 关闭文件
# decode() 解码字符串
# dict.keys() 获取字典所有的键
# find()字符串首次出现的索引
# f.read() 读取文件内容
# dict.update()更新字典
# dict.items() 获取字典键/值对
# dict.get() 返回指定键的值
# encode() 编码字符串
# list.sort() 排序列表元素
# index() 元素首次出现的索引
# isdigit() 判断字符串是否只由数字组成
# isupper() 是否所有字母都为大写
# isnum() 判断字符串是否由字母和数字组成
# islower() 是否所有字母都为小写
# isdecimal() 检查字符串是否只包含十进制字符
# isalpha() 检测字符串是否为纯字母
# random.shuffle()随机排序
# random.sample()返回无重复随机数列表
# random.choice() 返回一个随机元素
# random.randint() 生成指定范围的随机整数
# random.randrange() 生成指定范围的指定递增基数随机整数
# pop() 删除列表中的元素
# remove()删除列表中的指定元素
# strip()去除空格
# lstrip()去除左侧空格
# rstrip() 去除右侧空格
# readline() 读取单行内容
# root.after() Tkinter中等待一段时间后再执行命令
# str.isnumeric() 验证字符串是否为数字(适用于Unicode)
# split()分割字符串
# ord() 将字符转换为整数
# replace() 字符串替换
# ljust() 左对齐填充
# rjust() 左对齐填充
# readlines() 读取所有行内容
# datetime.datetime.now() 返回指定时区的本地日期时间
# datetime.datetime.today() 获取当前本地日期的date对象
# datetime.utcnow() 返回当前UTC时间的datetime对象
# time.strptime()把时间字符串解析为元组
# time.time()返回当前时间的时间戳
# time.sleep()暂停指定秒数
# time.strftime() 返回指定格式的日期字符串
# time.mktime() 接收时间元组并返回时间戳
# os.getcwd() 获取当前工作目录
# os.listdir() 获取指定路径下的目录和文件列表
# os.makedirs() 递归创建目录
# os.rename() 重命名目录或文件
# os.path.exists() 判断路径是否存在
# upper() 全部转换为大写字母
# lower() 全部转换为小写字母
# sys.stdout.write() 标准输出打印
# sys.stdout.flush()刷新输出
# shutil.copy() 复制单个文件到另一文件或目录
# write() 写入文件内容
# winsound.Beep() 打开电脑扬声器
# zfill() 在字符串前面填充0
三、循环语句
# break终止当前循环
# continue 终止本循环进入下一次循环
# with open() as file 以with语句打开文件(数据保存)
四、转义字符
\ 行尾续行符
\' 单引号
\'' 双引号
\a 响铃
\e 转义
\n 换行
\t 横向制表符
\f 换页
\xyy 十六进制yy代表的字符
\\反斜杠符号
\b 退格
\000 空
\v 纵向制表符
\r 回车
\0yy 八进制yy代表的字符
\other 其他的字符以普通格式输出