Python学习笔记

Python学习笔记


可以点击右侧四横杠图标打开目录快速浏览哦!

 

po先学过C和C++,故本文会部分提到与C的区别,没学过的可以自动忽略哦。(第三章之后不同之处有点多,懒得提了~)

一:环境配置

还没有搞太懂,暂时咕咕咕🕊

下文代码采用非交互式(脚本式)

且采用python3

二:变量与数据类型

1.变量的命名

如果你有学习过C,那这一部分与C相似。

1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线开头,但不能以数字开头。

2.变量名不能包含空格,但可使用下划线来分隔其中的单词。

3.不要将Python关键字和函数名用作变量名。

4.变量名应既简短又具有描述性,见名知义。

5.Python中区分大小写。

6.慎用小写字母l和大写字母O,因为它们可能被人错看成数字1和0。

2.数据类型

注释

在这里先提一嘴注释。

# 一个井号(#)在开头单行注释
# 前后各三个单引号或者三个双引号可以多行注释
'''
a=5
print(a+True)
print(a+False)
'''
"""
a=5
print(a+True)
print(a+False)
"""
#选中要注释的多行,按Ctrl+/ 也可以实现一次多行注释
#注意是Ctrl+/不是Ctrl+#
# a=5
# print(a+True)
# print(a+False)
# a=1
# print(a+True)

以后部分解释就写在注释里了,继续说数据类型

python中的标准数据类型有五种,包括数字(Numbers)、字符串(string)、列表(List)、元组(Tuple)、字典(Dictionary)。这里先简单介绍一些基础。

Python变量不需要先定义,可直接使用,且不需要说明数据类型(系统自动判定)

这点与C大不相同,因为python的变量其实是指针,用变量名指向这些保存的数据。

  1. 有符号整型(int)

    二进制:b 八进制:o 十六进制:x

    #注意区分数字0和小写字母o
    a=10
    print(a)#输出语句
    a=0b10
    print(a)
    a=0o10
    print(a)
    a=0x10
    print(a)
    #输出
    #10
    #2
    #8
    #16

    注:Python2中存在长整型(Long),python3中直接被int包含。

  2. 浮点数(float)

    十进制小数转换成二进制小数有时并不能精确转换

    a=2.1
    print(a-2)
    a=3.3
    print(a-1.2)
    #输出
    #0.10000000000000009
    #2.0999999999999996
  3. 复数(complex)

    a=5-4j#要用j哦,不要习惯性用i
    print(a.real)#取实部
    print(a.imag)#取虚部
    print(complex(4,-6))#用实部和虚部创建一个复数
    #5
    #-4
    #4-6j

    1、2、3均属于Numbers

  4. 字符串(string)

    字符串就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号, 也可以是双引号。(这一点与C不同,python中没有字符类型)

  5. 布尔值(bool)

    只有Ture和False(注意大小写)

    python中可以对bool进行加减法运算

    Ture为1,False为0

    a=5
    print(a+True,)
    print(a+False)
    #输出
    #6
    #5
  6. 空值

    空值为None(不能看作是0)

    学过C的不要搞成Null了。

  7. 列表,字典,元组及上文的一些拓展内容放在后面

三:输入与输出

1.输入

#输入值保存为字符串
n=input()
#有提示语的输入
n=input("请输入:")
#输入值保存为int
n=int(input())
#输入值保存为float
n=float(input())
#还没搞懂qwq
#n=eval(input())
#输入两个字符串,中间以空格分隔
a,b=input().split(" ")
#输入三个字符串,中间以逗号分隔
a,b,c=input().split(",")
#输入三个int值,中间以空格分隔
a,b,c=map(int,input().split(" "))
#输入三个int值,中间以逗号分隔
a,b,c=map(int,input().split(","))
#更详细的可以看这篇文章
#感谢原作者
#https://blog.csdn.net/qq_45817631/article/details/119717746

2.输出

普通输出

#采用print输出
#想必前面你也看到一些啦
#print里面可以放变量,常量,表达式等
print(1)
print("人生苦短,我学python")
#输出多个对象可以用逗号分隔
a=1
print("hello",a)
#hello 1
#对象之间默认以空格分隔
#可以用sep设置间隔符,例如“.”
a=1
print("hello",a,"world",sep=".")
#hello.1.world
#输出多个字符串不需要逗号
print("hello""world")
#可以用end设置行末
print("设置行末不换行",end="")
print("~~看没换吧")
#设置行末不换行~~看没换吧
#如果不写end,默认为end="\n"
#可以设置一些符号或字符串
print("123",end="biu")
print()#相当于换行
print("456",end="biu")
#123biu
#456biu
#如果将上面的print()改为print('\n')
#则会出现换两行的情况

格式输出

#插入变量
a=1
b="x^2=1(x>0)"
print("方程%s的解为x=%d" %(b,a))
#方程x^2=1(x>0)的解为x=1
#控制字段宽度和小数点位数
#先取小数点(小数点字段宽度为1哦)
#取小数点时四舍五入
#然后字段宽度不足10位,左侧加2个空格
PI=3.141592658979323846
print("%10.6f" %PI)
# 3.141593
#也可以用*来代替
a=10
b=4
PI=3.141592658979323846
print("%*.*f" %(a,b,PI))
#   3.1416
#左对齐
a=10
b=4
PI=3.141592658979323846
print("%-*.*f" %(a,b,PI))
#3.1416    
#显示正号
a=10
b=4
PI=3.141592658979323846
print("%+*.*f" %(a,b,PI))
#   +3.1416
#不够时用0补(仅右对齐,且0的位置不对劲?
a=10
b=4
PI=3.141592658979323846
print("%+0*.*f" %(a,b,PI))
#+0003.1416
a=33
c=321211221312123
PI="aa"
b='q'
print("%s %r %c %d %i %o %x %f %% %e %E %g %g %G %G " %(PI,PI,b,a,a,a,a,a,a,a,a,c,a,c));
#aa 'aa' q 33 33 41 21 33.000000 % 3.300000e+01 3.300000E+01 33 3.21211e+14 33 3.21211E+14
#二进制%b好像不能输出,有没有会的uu教一下qwq
#emm...好像只能采用函数?
print(bin(33)) #二进制
print(oct(33)) #八进制
print(hex(33)) #十六进制
#0b100001
#0o41
#0x21
格式符说明格式符说明
%s 字符串采用str()的显示 %o 以八进制输出
%c 输出字符 %x 以十六进制输出
%t 制表符(一个Tab,即四个空格) %f 浮点数输出
%d 以十进制输出 %% 输出%
%i 以十进制输出 %r 字符串(repr())的显示
%g 指数(e)或浮点数(根据显示长度) %G 指数(E)或浮点数(根据显示长度)
%e 指数(基底写E) %E 指数(基底写E)

四:符号

1.分号(;)

  1. 可以用于同一行显示多条语句。

    print("hello,",end="");print("world!")
    #hello,world!

2.反斜杆(\)

  1. 可以用于将一行语句分为多行显示。

    a=33
    c=321211221312123
    PI="aa"
    b='q'
    print("%s %r %c %d %i \
          %x %f %% %e %E \
          %g %G %G %o %g" \
          %(PI,PI,b,a,a,a, \
          a,a,a,a,a,c,a,c));

    但语句中含有[],{},()时,无需使用\。

    univ= ['ZJU', 'PKU', 'THU',
           'FDU', 'SJTU']
    #三非野捏~

3.引号(',",''',""")

  1. 字符串用单引号或者双引号括起来。

  2. 三个单引号或者双引号可以用于注释(详见上文)。

  3. 三个单引号或者双引号也可以用于输出多行。

    str="""第一行
    第二行"""
    print(str)
    str='''第一行
    第二行'''
    print(str)
    #第一行
    #第二行
    #第一行
    #第二行

    不要用企图双引号蒙混两个单引号,会报错滴!

    #但可以善用引号输出引号
    str='"第一,第二"'
    print(str)
    #"第一,第二"

4.等号(=)

  1. 用于给变量赋值

    d=7
    #可一次给多个变量赋值
    a,b,c= 1,2.0,"hello"
  2. 轻松交换a,b

    a=1
    b=2
    a,b=b,a;
    print(a," ",b);

5.加号(+)

  1. 数字加法

  2. 字符串串联

    a="hello,"
    b="world"
    print(a+b)
    #hello,world

6.减号(-)

  1. 数字减法

7.乘号(*)

  1. 数字乘法

  2. 两个乘号实现数字的幂

    a=3
    b=4
    c=a**b
    #a的b次方
  3. 重复打印字符串

    a="hello"
    b=2
    print(a*3)
    print(3*a)
    print(a*3*2)
    print(a*3*b)
    print((a*3)*2)
    #hellohellohello
    #hellohellohello
    #hellohellohellohellohellohello
    #hellohellohellohellohellohello
    #hellohellohellohellohellohello

8.除号(/)

  1. 数字除法,不会取整滴

    注意:Python2里整数除整数,只能得出整数。如果要得到小数部分,要把其中一个数改成浮点数。

    a=3
    b=4
    c=b/a
    print(c)
    #1.3333333333333333
  2. 双除号实现取商,向下取整

    a=-3
    b=4
    c=b//a
    print(c)
    #-2

9.百分号(%)

  1. 用于格式化输出

  2. 取余

    a=100
    b=27
    c=a%b
    print(c)
    a=4
    b=-3
    c=a%b
    print(c)
    #19
    #-2
    #没有搞懂为什么是-2 qwq

10.比较运算符

这部分比较简单,列个表即可~

运算符说明运算符说明
== 判断是否相等 != 判断是否不相等
> 大于 < 小于
>= 大于等于 <= 小于等于

注意:python2中<>等于!=,python中已经不使用了。

11.位运算符

这部分比较简单,列个表即可~

运算符说明(以a运算符b为例)运算符说明
& 按位与,二进制按位相同为1 ^ 按位异或,二进制按位不同为1
| 按位或,二进制按位有一个1,即为1 ~ 二进制按位取反
>> 二进制右移b位 << 二进制左移b位

12.赋值运算符

这部分比较简单,列个表即可~

运算符说明(以a运算符b为例)运算符说明(以a运算符b为例) 
+= a=a+b -= a=a-b  
*= a=a*b /= a=a/b  
%= a=a%b //= a=a//b  
**= a=a**b >>= a=a>>b  
&= a=a&b |= a=a|b  
^= a=a^b << a=a<<b  

13.逻辑运算符

这部分比较简单,列个表即可~

运算符说明运算符说明
and or
not    

14.身份运算符

这部分比较简单,列个表即可~

运算符说明(以a运算符b为例)
is 判断是否引自同一个对象,与id(a)==id(b)类似
is not 判断是否引自不同对象,与id(a)!=id(b)类似

如果你有疑问,可以看看二.2.1前方下划线文字

关于成员运算符,用到的时候再说吧~

15.运算符优先级

挖个坑......

五:条件与循环

1.条件语句

  1. 基本形式

    if(判断条件):
    语句
    else:
    语句

    冒号别漏!!冒号别漏!!冒号别漏!!

    指定任何非0和非空(null)值为True,0 或者 null为False。

    判断语句的括号可以省略,

    但省略后和if之间要用空格分开,

    所以不建议省略(其实是po写C写多了,不习惯,忽略哈~。

    语句可以多行,不必用{}包围,

    但以缩进来区分表示同一范围。

    注意python的缩进十分严格滴!!!

    注意python的缩进十分严格滴!!!

    注意python的缩进十分严格滴!!!

    缩进的空白数量是可变的,但是同一代码块语句必须包含相同的缩进空白数量,

    不过Tab和空格可以混用,毕竟一个Tab等于四个空格,

    且else的代码块缩进不必与if代码块相同,毕竟不是同一代码块。

    但不建议这样,毕竟要美观。

    下面这个是合法滴:

    a=1
    if(a==1):
       print(a)#按了一个Tab
       print(a+1)#按了四个空格
    else:
     print(a+3)
    #也可以写在同一行
    #但若非很简单的语句,真的不建议
    #因为不美观
    #例如:
    a=2
    if(a==1):print(a);print(a+1)
    else:print(a+3)
    #好看的简单语句
    a=1
    if a==1: print(a+1)

    推荐写成这样:

    a=1
    if(a==1):
       print(a)#按了一个Tab
       print(a+1)#按了四个空格
    else:
       print(a+3)
  2. 多重分支

    #就是这样,没什么好说
    #注意点与上面类似
    if 条件1:
    语句1
    elif 条件2:
    语句2
    elif 条件3:
    语句3
    else:
    语句4

2.while循环

  1. 基本形式

    #注意点与if类似
    while 判断条件:
    语句
  2. 使用else语句的while

    #在条件为False(即正常结束循环(看看下面的break))时会执行else
    while 判断条件:
      语句
    else:
      语句

3.for循环

先写一点基本的,后边再细说qwq

  1. 遍历数字范围

    利用range函数

    #range(start,end,step)
    #i范围[1,100)即[1,99]
    for i in range(1,100):
    print(i)
    #若range中只写一个数字则从0开始
    for i in range(100):
    print(i)
    #i范围[0,100)
    #可设置步长
    #输出1到99的奇数
    for i in range(1,100,2):
    print(i)
    #逆序输出100到1
    for i in range(100,0,-1):
       print (i)
  2. 遍历字符串中字符

    str="python"
    for i in str:
    print(i)
  3. 使用else的for

    #在条件为正常结束循环(看看下面的break)时会执行else
    for ... in ...:
      语句
    else:
      语句

4.break、continue、pass

  1. break

    跳出包含该break的循环,若该循环含else,else也不会执行。

  2. continue

    结束此轮循环,直接进入下一轮

  3. pass

    空语句(占位语句)

    #例如如果你还没想好else中要写什么
    #直接不写会报错的
    str="python"
    for i in str:
    print(i)
    else:
    #可以写个pass占个位置
    str="python"
    for i in str:
    print(i)
    else:
       pass

六.数据类型深入

1.字符串

  1. 取子串

    str="python"
    #字符下标从0开始哦
    print(str[0])
    #str[6]就越界了,会报错
    print(str[5])
    #左闭右开,故可以到6
    print(str[3:6])
    #左边不写就是从0开始
    print(str[:4])
    #右边不写就是输出到结束
    print(str[4:])
    #p
    #n
    #hon
    #pyth
    #on
  2. 大小写

    name="jupyter"
    #首字母大写
    print(name.title())
    #全部大写
    name=name.upper()
    print(name)
    #全部小写
    name=name.lower()
    print(name)
    #Jupyter
    #JUPYTER
    #jupyter
  3. 字符串串联

    a="hello,"
    b="world"
    print(a+b)
    #hello,world
  4. 去空格

    n=' python '
    #去右空格
    print(n.rstrip(),end='@\n')
    #去左空格
    print(n.lstrip(),end='@\n')
    #去两侧空格
    print(n.strip(),end='@\n')
    # python@
    #python @
    #python@
  5. 成员运算

    运算符说明
    in 如果在指定的序列中找到值返回 True,否则返回 False。
    not in 如果在指定的序列中没有找到值返回 True,否则返回 False。

    实例:

    str="python"
    if 'y' in str:
       print("'y' in python")
    if 'a' not in str :
       print("'a' not in python")
    #'y' in python
    #'a' not in python
  6. 原始字符串输出

    一些字符串无法输出时,可以用r/R使其成功输出

    print(r"1\n","\n2")
    print(R"3\n")
    #1\n
    #2
    #3\n
  7. 字符比较

    按位比较ASCII码

  8. 字符串内建函数

    详见此文底部表格:

    python字符串

2.列表(List)

列表是python中的基本数据结构,其实前面早该讲了,po懒了~

  1. 创建列表

    空列表

    list1 = []

    含数据的列表

    list1 = [1,2,3,4]
    list2 = ['a','ba','csa','d']
    list3 = [1,2.0,3,4,'5','a','ba','csa','d']
  2. 访问与截取列表

    与字符串下标一样,列表下标从0开始,也同样可以截取,也同样截取左闭右开区间。

    list1 = [2,3,4,6,4]
    print(list1[0],list1[3:4],list1[1:5],list1[3:])
    #2 [6] [3, 4, 6, 4] [6, 4]
    #直接输出整个列表
    print(list1)
    #[2, 3, 4, 6, 4]
    #访问倒数第二个
    print(list1[-2])
    #6
    university = ['zju','thu','pku','fdu','sjtu']
    for uni in university :
    print("I love %s."%uni.upper())
    #I love ZJU.
    #I love THU.
    #I love PKU.
    #I love FDU.
    #I love SJTU.
  3. 更新列表

    用append()函数在末尾添加元素

    list=[1,2,3,4]
    list.append(5)
    print(list[0:5])
    #[1, 2, 3, 4, 5]

    用insert(index,obj)函数在指定位置添加元素

    list=[1,2,3,4]
    list.insert(2,5)
    print(list[0:5])
    #[1, 2, 5, 3, 4]

    用extend()函数在末尾链接另一个列表

    list1=[1,2,3,4]
    list2=[5,6,7,8]
    list1.extend(list2)
    print(list1)
    print(list2)
    #[1, 2, 3, 4, 5, 6, 7, 8]
    #[5, 6, 7, 8]

    运算符赋值

    list1=[1,2,3,4]
    list2=[5,6,7,8]
    list1+=list2
    list2=list1
    print(list1)
    print(list2)
    #[1, 2, 3, 4, 5, 6, 7, 8]
    #[1, 2, 3, 4, 5, 6, 7, 8]

    range生成

    list=list(range(1,9))
    print(list)
    #[1, 2, 3, 4, 5, 6, 7, 8]
  4. 删除列表

    用del语句删除指定位置元素

    l = [1,2,3,4,5,6,7]
    del l[1]
    print(l)
    del l[1:3]
    print(l)
    #[1, 3, 4, 5, 6, 7]
    #[1, 5, 6, 7]

    用pop(index)函数移除指定位置元素

    list1=[1,2,3,4]
    list1.pop(0)
    print(list1)
    #不写index默认为末尾
    list1.pop()
    print(list1)
    #[2, 3, 4]
    #[2, 3]

    用remove(obj)删除第一个指定元素

    list1=[1,2,1,3,4]
    list1.remove(1)
    print(list1)
    #[2, 1, 3, 4]
    #1已经不在list中了,会报错
    list1.remove(1)
    print(list1)
  5. 零碎的点

    运算符操作

    #加与乘
    list1=[1,2,3]
    list2=[4,5,6]
    list1+=list2
    list2*=4
    print(list1)
    print(list2)
    #成员运算符
    if(3 in list1):
    print("3 in list1")
    if(9 not in list1):
    print("9 not in list1")
    #[1, 2, 3, 4, 5, 6]
    #[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
    #3 in list1
    #9 not in list1

    其他看着比较有用的函数~

    1.列表中元素个数 len()

    list = [1,2,3,4,5,6,7]
    len=len(list)
    print(len)
    #7

    2.取最大最小max(),min()

    list = [1,2,3,4,5,6,7]
    print(max(list),min(list))
    list = ['a','b','e','d']
    print(max(list),min(list))
    list = ['azvf','bzz','0e','zd']
    print(max(list),min(list))
    #7 1
    #e a
    #zd 0e

    3.统计出现次数count()

    list = [1,2,3,4,1,1,'1',5,6,7]
    print(list.count(1))
    #3

    4.反向列表元素 reverse()

    list = [1,2,3,4,1,1,'1',5,6,7]
    print(list)
    list.reverse()
    print(list)
    #[1, 2, 3, 4, 1, 1, '1', 5, 6, 7]
    #[7, 6, 5, '1', 1, 1, 4, 3, 2, 1]
    #该函数返回值为None
    #直接调用即可,不要再赋值给list
    list = [1,2,3,4,1,1,'1',5,6,7]
    print(list)
    list=list.reverse()
    print(list)
    #[1, 2, 3, 4, 1, 1, '1', 5, 6, 7]
    #None

    5.排序sort()

    list = [3,4,1,5,7,8,6,2]
    #默认为reverse为False,升序
    list.sort()
    print(list)
    #降序
    list.sort(reverse=True)
    print(list)
    #[1, 2, 3, 4, 5, 6, 7, 8]
    #[8, 7, 6, 5, 4, 3, 2, 1]
    #sort中其实有三个参数,有兴趣的可以自己研究一下
    #list.sort(cmp=..., key=..., reverse=...)
    #sort()与上面reverse相似,同样返回值为None
    #临时排序
    #排序后不改变原list
    list = [3,4,1,5,7,8,6,2]
    print(sorted(list,reverse=True))
    print(list)
    list=sorted(list)
    print(list)
    #[8, 7, 6, 5, 4, 3, 2, 1]
    #[3, 4, 1, 5, 7, 8, 6, 2]
    #[1, 2, 3, 4, 5, 6, 7, 8]
    #可以看出sorted是有返回值的
  6. 求和sum()

    list = [3,4,1,5,7,8,6,2]
    print(sum(list))
    #36

3.元组(tuple)

元组与列表类似,但元组使用圆括号。

  1. 创建元组

    #空元组
    tup=()
    #仅含一个元素的元组
    #元素后要加逗号
    tup=(19,)
    #多元素
    tup1=(1,2,3,4,5)
  2. 访问与截取

    与列表相同,略。

  3. 修改

    #仅能进行整个的赋值操作
    tup1=(1,2,3,4,5)
    tup2=(2,)
    tup1=tup2+tup1
    print(tup1)
    tup1=tup2
    print(tup1)
    #(2, 1, 2, 3, 4, 5)
    #(2,)
    #修改单一元素语法错误
    #tup[1]=0
  4. 删除

    #仅能进行删除整个元组
    tup1=(1,2,3,4,5)
    del tup1
    #删除单一元素语法错误
  5. 零碎的点

    #加与乘
    tup1=(1,2,3)
    tup2=(4,5,6)
    tup1+=tup2
    tup2*=4
    print(tup1)
    print(tup2)
    #成员运算符
    if(3 in tup1):
    print("3 in tup1")
    if(9 not in tup1):
    print("9 not in tup1")
    #遍历
    for i in tup1:
       print (i,end=" ")
    #函数
    tup1=(9,2,3)
    print(len(tup1))
    print(max(tup1))
    print(min(tup1))
    #将列表转换为元组
    list=[3,4,7,8]
    print(list)
    print(tuple(list))
    #(1, 2, 3, 4, 5, 6)
    #(4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6)
    #3 in tup1
    #9 not in tup1
    #1 2 3 4 5 6
    #3
    #9
    #2
    #[3, 4, 7, 8]
    #(3, 4, 7, 8)

4.字典(Dictionary)

同一个字典中可以储存任意类型的对象

  1. 定义

    #dic={key1:value1,key2:value2}
    dic={1:'a',2:'b',3:'c'}
    #键(key)唯一,如果重复,则后一个会覆盖前一个
    dic={1:'a',2:'b',2:'c'}
    print(dic[2])
    #c
  2. 访问

    #按键取值
    dic={1:'a','c':'b',3:'c'}
    print(dic['c'])
    #b
  3. 修改与更新

    #键不可修改,只可以修改值
    dic={1:'a','c':'b',3:'c'}
    dic[1]='ZJU'
    dic['qwq']='orz'
    print(dic)
    #{1: 'ZJU', 'c': 'b', 3: 'c', 'qwq': 'orz'}
  4. 删除

    dic={1: 'ZJU', 'c': 'b', 3: 'c', 'qwq': 'orz'}
    #删除一组键与值
    del dic['c']
    print(dic)
    #清空字典
    dic.clear()
    print(dic)
    #{1: 'ZJU', 3: 'c', 'qwq': 'orz'}
    #{}
    #删除字典
    del dic
    #再调用就报错了
    #print(dic)
  5. 一些函数

    dic={1: 'ZJU', 'c': 'b', 3: 'c', 'qwq': 'orz'}
    #键数
    print(len(dic))
    #好懒...
    #仙姑qwq

七.自定义函数

  1. 语法

    def 函数名(参数):
    语句
    return [表达式]
    #不带表达式return为None

     

 

 

 

 

本文为学习记录,可能会有错误,欢迎批评指正。也因此借鉴了许多文章书籍,无法一一列举,深表遗憾,如有不妥,请联系我删除,感谢您的帮助与支持。

posted @   CrLamb  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示