Python3 - print()

  在Python3中。print()的使用方法如下:

# Pycharm中演示
# ==== print() end参数 ====

print('hello',end='<----')
print('world')

# ==== 执行结果 ====
# hello<----world

  print后面必须跟上括号,所打印的内容必须由单引号、双引号、三单引号、三双引号、以上其中任意一种括起来才能使用。这是Python语法规定的死规范。

  除此之外print()还可以接收3个参数分别是 sepend以及file

print()参数详解 
sep 用来显示间隔中的链接字符,默认为一个空格
end 指定当print()结束后的下一个print()的位置相较于上一次print()。默认换行 \n
file 指定print()的内容写入到某个指定的文件句柄中。默认为空

  sep示例:

>>> # ==== print() sep参数 ====
>>>
>>> print("hello","world")  # 不指定sep参数
hello world
>>> print("hello","world",sep="-------")  #指定sep参数
hello-------world
>>>

  end示例:

# Pycharm中演示
# ==== print() end参数 ====

print('hello',end='<----')
print('world')
hello<----world

  file示例:

# Pycharm 中演示
# ==== print() file参数 ====

with open(file='a.text',mode='w',encoding='utf-8') as f:
    print('这一行将被写入文件中去...',file=f)

  print()的底层实现原理(自我猜测版本):

I/O格式化与运算符

I/O格式化与运算符

  在这可以看到sys.stdout的字样。所以这里猜想是调用了sys.stdout.write()方法,如果我们将file指定为某一个文件,那么屏幕上便不会再显示print()打印的字样而是直接将内容写入到了文件中。

  flush是刷新的意思,以下代码可以在原生Python解释器中打开执行一下。分别删除flush = True 执行2次你就能看到效果了。

# ==== print() flush参数 ====

import time
time.sleep(0.1)
print('下载中',end="")
for i in range(100):
    print('#',flush=True,end="") # 一种直接全部打印 100 个 #。加了flush = True偶则是慢慢打印。会有一种视觉上的效果

Python2 - print()

  Python2的print()允许像Python3那样使用,但更多人使用Python2的print()是不带括号的。关于使用方式有这点差别,更深层的东西这里没有去研究了。

>>> # ==== Python2 print() ====
>>>
>>> print("hello,world") # 允许 Python3中的使用方式
hello,world
>>> print "hello,world" # 允许 不加入括号,这在Python3中是不被允许的
hello,world
>>>

输入函数

Python3 - input()

  Python3中提供了input()方法来接收用户输入的值。但是Python3中的input()方法会将一切用户输入的值转换为str类型。这里一定要注意!

# ==== Python3 - input() ====

name = input("请输入您的姓名:")
age = input("请输入您的年龄:")
print("name的类型是:",type(name))
print("age的类型是",type(age))  # <class 'str'>
# ==== 执行结果 ====

"""
请输入您的姓名:yunya
请输入您的年龄:18
name的类型是: <class 'str'>
age的类型是 <class 'str'>
"""

  如果我们想求一个整形或者浮点型的数据,我们就将其使用int()或者float()包裹住输入的数据即可:

    int()

      - 只能包裹字符串str类型以及浮点型float(向下取整)

    float()

      - 只能包裹字符串str类型以及整形

# ==== Python3 input() 类型转换 ====

name = input("请输入您的姓名:")
age = int(input("请输入您的年龄:")) #注意用int()包裹input()返回的str类型的内容。并且做一次转换:确保用户输入的是 整形样式的字符串,否则会抛出异常
print("name的类型是:",type(name))
print("age的类型是",type(age)) # <class 'int'>

# ==== 执行结果 ====

"""
请输入您的姓名:yunya
请输入您的年龄:18
name的类型是: <class 'str'>
age的类型是 <class 'int'>
"""

  这里提一嘴:如果用户输入的不是整形样式的字符串,则会抛出异常。那么如何处理先不着急,只需要记得肯定有处理的方法。

Python2 - raw_input()

  Python2中的 raw_input() 和上面介绍的 Python3 中的input()使用方法和功能全部都是一样的。这里不做详解,需要注意的是:Python3中没有raw_input()方法

>>> # ==== Python2中的raw_input() ====
>>>
>>> name = raw_input("请输入姓名:")
请输入姓名:yunya
>>> age = raw_input("请输入年龄:")
请输入年龄:18
>>> type(name)
<type 'str'>
>>> type(age)
<type 'str'>
>>>

Python2 - input()

  Python2中的input()与Python3中的input()大不相同。Python3中的input()无论用户输入的值是什么都会转换为str类型,而Python2中的input()是用户输入什么类型的值就自动转换成什么类型,看起来挺好的。但是实际是非常不方便的,具体原因看下图

>>> # ==== Python2中的input() ====
>>>
>>> name = input("请输入姓名:")
请输入姓名:yunya  # 注意:这里没加引号,Python2的input()会认为这是一个变量。而改变了未绑定堆区变量值,所以抛出 yunya 未定义的这么一个异常。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'yunya' is not defined
>>> name = input("请输入姓名:")
请输入姓名:"yunya"
>>> name
'yunya'  #用户必须按照Python语法规范来输入,极大的拉低了用户体验
>>>
>>> city = input("请输入城市:")  #假如用户输入了不符合Python语法数据便直接抛出异常。
请输入城市:["哈尔滨",
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    ["哈尔滨"^
SyntaxError: invalid syntax
>>>

字符串格式化

%

  格式化的意思是我们有的时候想让变量值与定义好的字符串做一个融合。这个时候就有三种方法,我们先来看第一种也是最原始的一种 % 方法:

# ==== %格式化 ====

name = "yunya"
age = 18
# ==== 位置传参 ====
# 一个 % 对应一个 变量名。当变量名有多个时便需要%后面跟上括号做解包,如若只有一个则不需要加上括号,% 和后面的 %(a,b,c)位置一一对应

msg = "姓名是:%s,年龄是%i"%(name,age) # %意味占位符,后面的字符代表转换的类型。如 %s代表接收任意类型的传值,%i代表只接受int类型的传值。
print(msg)

# ==== 关键字传参 ====
msg2 = "姓名是:%(name)s,年龄是%(age)i" %{'age':age,'name':name} # 变量名存储变量值内存地址引用。关键字传参打破位置顺序必须统一的限制.
print(msg2)

# ==== 格式化 % 百分号 ====
print('%s%%'%3) # %% 百分号代表一个 % 。放在 %s 后面则代表格式化出后的结果是 3%

# ==== 执行结果 ==== 

"""
姓名是:yunya,年龄是18
姓名是:yunya,年龄是18
3%
"""
 
占位符说明
%s 字符串(采用str()的显示) Ps:推荐使用 %s 。 因为它接收所有类型的传值
%r 字符串(采用repr()显示) Ps:原始字符串
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)

format()

  %虽然能够满足基本需求。但是其位置传参还是显得太过麻烦,故在Python2.6中新增format() 方法,它更加强大以及速度更快。推荐今后使用format()的方法进行字符串格式化 ,注意:format()中的s只接受str类型的传值而不接受全部类型!!!

# ==== format()格式化 ====

name = "yunya"
age = 18

# ==== 位置传参 ====
msg = "姓名是{:s},年龄是{:d}".format(name, age)  # 采用{}进行占位,需要注意的是format中的 s 不是接收全部类型的参数,而是指定str
# msg = "姓名是{},年龄是{}" .format(name,age) 也可不指定类型。默认接收全部类型参数
print(msg)

# ==== 索引传参 ====
msg2 = "姓名是{1:d},年龄是{0:s}".format(name, age)  # 采用{}进行占位 。 无法使用s接收age.且 format()中没有 i
# msg2 = "姓名是{1},年龄是{0}" .format(name,age
print(msg2)

msg3 = "姓名是{0:s}{0:s}{0:s},年龄是{1:d}{1:d}{1:d}".format(name, age)  # 采用{}进行占位 。 无法使用s接收age
# msg3 = "姓名是{0:s}{0:s}{0:s},年龄是{1:d}{1:d}{1:d}".format(name, age)  #
print(msg3)

# ==== 关键字传参 ====
msg4 = "姓名是{name:s},年龄是{age:d}".format(name=name, age=age)  # 采用{}进行占位 。 无法使用s接收age
# msg4 = "姓名是{name},年龄是{age}" .format(name=name,age=age)
print(msg4)

# ==== 字符填充 ====
print('{0:*<10}'.format('|||'))  # < 代表字符 ||| 在左边,填充符号为 * 排在右边 一共10 个( 算上字符三个 | )
print('{0:%>10}'.format('|||'))  # > 代表字符 ||| 在右边,填充符号为 % 排在左边 一共10 个 ( 算上字符三个 | )
print('{0:$^10}'.format('|||'))  # ^ 代表字符 ||| 在中间,填充符号为 $ 排在两侧 两侧加起来共10个 ( 算上字符三个 | )
print('{0:$=10}'.format(123))    # = 代表数字 123 在右边,填充符号为 $ 排在左边 一共10个 Ps: = 只针对数字 ( 算上字符123 )

# ==== 精度控制与格式转换 ====
print('{0:.2f}'.format(3.1415926535))  # f代表接收值类型为float类型,.2代表小数点后保留2位
print('{0:b}'.format(10))  # 转换为二进制 b
print('{0:x}'.format(10))  # 转换为十六进制 x
print('{0:o}'.format(10))  # 转换为八进制 o
print('{0:,}'.format(1000000))  # 千分位表示 ,
print('{0:.2%}'.format(1))  #百分号表示  2代表2位数,转换数据1 为 百分之百
print('{0:.2%}'.format(0.3))  #百分号表示
print('{{{0}}}'.format('笑脸')) # 显示大括号。 外部套2层大括号

# ==== 执行结果 ====

"""
姓名是yunya,年龄是18
姓名是18,年龄是yunya
姓名是yunyayunyayunya,年龄是181818
姓名是yunya,年龄是18
|||*******
%%%%%%%|||
$$$|||$$$$
$$$$$$$123
3.14
1010
a
12
1,000,000
100.00%
30.00%
{笑脸}
"""

Python3 - f

  尽管format()已经非常方便了。但是如果传入的参数值太多依旧会看着十分混乱,于是Python3.6中新增了 f 格式字符串的操作。这种方法的速度最快,但是却不推荐使用,因为程序还要考虑一个向下兼容性的问题

# ==== f 格式化 ====

name = "yunya"
age = 18

msg = f'我的名字叫做{name},我的年龄是{age}岁。'  # f 开头。 {} 为占位符用于存放变量名。
print(msg)
# 其他的关于高级操作如填充字符,精度控制与格式转换等等均与format()操作方式一样。

# ==== 执行结果 ====

"""
我的名字叫做yunya,我的年龄是18岁。
"""

算术运算符

+ - * /

  详细举例每种数据类型支持的运算符:

+ 加法运算:

    intint float(生成floatbool

    floatfloat int bool

    boolbool int float (均生成intfloat

    listlist(改变元素内index的引用值,而不改变list对应栈区变量名的引用值)

    strstr(由于是不可变类型,生成新的str

    tuple:tuple (由于是不可变类型,生成新的tuple

# ==== + 加法运算 ====

# 以下代码均在Pycharm中测试通过

print(1 + 1)
print(1 + 1.1)
print(1 + True)
print([1, 2, 3] + [4, 5, 6])
print('OldStr ' + ' NewStr')  # 改变引用值,生成新对象
print((1, 2, 3) + (4, 5, 6))  # 改变引用值,生成新对象

# ==== 执行结果 ====

"""
2
2.1
2
OldStr
NewStr
[1, 2, 3, 4, 5, 6]
(1, 2, 3, 4, 5, 6)
"""
+加法运算

相关文章: