当前位置:   article > 正文

Python 学习(一)_当你将对象作为参数传给一个函数时,指向原始对象的新的本地变量就会

当你将对象作为参数传给一个函数时,指向原始对象的新的本地变量就会

python学习(一)

在Python中对于一个变量赋值时,你就创建了指向等号右边对象的引用。实际上当有一个整数列表时

In[8]:a=[1,2,3]

假设我们将a赋值给一个新的变量b:``

In[9]:b=a

在一些语言中,会是数据[1,2,3]被拷贝的过程。在python中,a和b实际上指向了相同的对象。

在python中,赋值也被称为绑定,在赋值的过程中,我们将一个变量名绑定到了一个对象上,变量对于对象来说只是特定命名空间中的名称:类型信息是存储在对象自身之中的。

检查两个引用是否指向一个对象,可以使用is关键字

a=[1,2,3]

b=a

c=list(a)(list函数总是创建一个新的python列表)

a is b

out=True

a is c=False

当你将对象作为参数传给一个函数时,指向原始对象的新本地变量也会被创建而无需复制。如果你将一个新的对象绑定到一个函数内部的变量上,这种变更不会在上级范围中产生影响。因此,更换可变参数的内部值是可以做到的。

python中的对象引用不涉及类型,以下操作是没有问题的:

In[12]:a=5

In[13]:type(a)

Out : int

检验一个对象是否是特定类型的函数isinstance(对象名,数据类型(可以接受一个元组))

python中的对象通常都会有属性(python对象“内部”存储的其他对象)和方法(与对象内部对象有关的函数)

getattr(object, name[, default])

Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, defaultis returned if provided, otherwise AttributeError is raised.

参数说明:

object:对象的实例
name:字符串,对象的成员函数的名字或者成员变量
default:当对象中没有该属性时,返回的默认值
异常:当没有该属性并且没有默认的返回值时,抛出"AttrbuteError"

tip:迭代器协议

迭代(iteration)
逐个获取元素的过程,就是「迭代」。

例如:

iteration

用 for 循环迭代序列

a_list = [1, 2, 3]for i in a_list:print(i)
1
2
3
4
5
可迭代(iterable
实现了方法 __iter__ 的对象是可迭代的。

如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。

Python 中的顺序类型,都是可迭代的,例如 list、 tuple,、string;另外 dict、set、 file 也是可迭代的。

def isitreable(obj)

try:

iter(obj)

return True

except: TypeError:

return False

迭代器(iterator)
实现了方法 next 的对象是迭代器。

当你调用方法 next (可不提供任何参数)时,迭代器应返回下一个值。如果迭代器没有可供返回的值,应引发 StopIteration 异常。

你还可使用内置的便利函数 next,在这种情况下,next(it) 与 it.__next__() 等效。

迭代器协议(iterator protocol)
迭代器协议指的是容器类需要包含一个特殊方法,这个特殊方法就是 __iter__() 方法。

如果一个容器类提供了 __iter__() 方法,并且该方法能返回一个能够逐个访问容器内所有元素的迭代器,则我们说该容器类实现了迭代器协议。

迭代器协议与 for 循环
讲这个例子,是为了更好地理解迭代器协议。

iterator protocol and for loop

for x in something:
print(x)
1
2
3
Python 处理 for 循环时,首先会调用 something.__iter__(),返回 something 对应的迭代器(假设叫 it);而后,for 循环会调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,然后执行循环体;执行完后,for 循环会继续调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,执行循环体 …… 当 for 循环调用 it.__next__()产生 StopIteration 异常时,循环结束。
if not isinstance(x,list) and isiterable(x):

x=list(x)

在python中可以使用单引号和双引号写一个字符串字面值,同时可以使用count方法计算c中各种字符的个数

data="dcahbajbacnaec"
data.count('c')
Out: 3
  • 1
  • 2
  • 3

在python中反斜杠属于转义字符,如果我们要操作含有大量反斜杠的字符串时,可以在字符串之前加一个前缀符号r

s=r’dva\cam\\\\lca'

字符串格式化:

format

. 通过位置来填充字符串

'{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
'{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
'{0}{1}{0}'.format('a', 'b')
'aba'

  1. 通过key来填充字符串

print 'hello {name1} i am {name2}'.format(name1='Kevin',name2='Tom')
hello Kevin i am Tom

  1. 通过下标来填充字符串

names=[‘Kevin’,‘Tom’]
print ‘hello {names[0]} i am {names[1]}’.format(names=names)
print ‘hello {0[0]} i am {0[1]}’.format(names)
hello Kevin i am Tom

  1. 通过属性匹配来填充字符串

class Point:
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __str__(self):
... return 'Point({self.x}, {self.y})'.format(self=self)
...
str(Point(4, 2))
'Point(4, 2)

  1. 通过字典的key来填充字符串

names={'name':'Kevin','name2':'Tom'}
print 'hello {names[name]} i am {names[name2]}'.format(names=names)
hello Kevin i am Tom

  1. 使用","作用千位分隔符

‘{:,}’.format(1234567890)
‘1,234,567,890’

  1. 百分数显示

points = 19
total = 22
‘Correct answers: {:.2%}’.format(points/total)
‘Correct answers: 86.36%’

  1. 小数位保留

'{:.2f}'.format(3.1415926)
3.14
'{:.0f}'.format(3.1415926)

字符集的转换

\# --*-- coding:utf8 --*--

  • 在python文件的开头,告知编译器使用哪一种编码格式来解释文件;
  1. encode() 和 decode()

    • 字符串 <=> 字节码, 编码和解码就是在字符串和字节码之间进行转换;

    • encode() 文件编码格式,默认为utf8,也可以指定其他格式encode("gbk")

    • decode() 文件解码格式,默认utf8, 也可以指定解码格式decode("gbk")

    • str = "你好"

    • print(type(str))

    • ``

    • *# 字符串str,由unicode转换成gb2312*

    • gb_str = str.encode("gb2312")

    • print(type(gb_str))

    • ``

    • *#字符串gb_str 直接转成utf-8*

    • """

    • utf_str = gb_str.encode("utf8")

    • """

    • ``

    • *# 不同字符集之间不能直接转换,需要先解码转成unicode*

    • unicode_str = gb_str.decode("gb2312")

    • print(type(unicode_str))

    • utf_str = unicode_str.encode("utf8")

    • print(type(utf_str))

    • print("============================")

    • ``

    • *# utf8 不能直接转成其他格式,需要解码为unicode*

    • unicode_str = utf_str.decode("utf8")

    • print(type(unicode_str))

    • gb_str = unicode_str.encode("gb2312")

    • print(type(utf_str)

      python中的时间与日期

      time(…):

      now(…):返回当前日期时间的datetime对象:

      a = datetime.datetime.now()
      a
      datetime.datetime(2017, 3, 22, 16, 9, 33,

time(…):返回datetime对象的时间部分:

  • a = datetime.datetime.now()
    a
    datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
    a.time()
    datetime.time(16, 9, 33, 494248)

combine(…):将一个date对象和一个time对象合并生成一个datetime对象:

a = datetime.datetime.now()
a
datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
datetime.datetime.combine(a.date(),a.time())
datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
元组

  • 列表通常用来存储相同类型的数据;而元组在实际开发中,通常用来存储不同类型的数据

  • 元组(Tuple)与列表相似,不同之处在于元组的元素不能修改

  • 元组表示多个元素组成的序列;用于存储一串信息,不同数据之间用逗号隔开;

  • 元组的索引从0开始

  • 元组中各元素之间用逗号隔开。元组不支持修改或删除其所包含的元素。如果要修改,则可以使用list函数把它转化成列表,然后在列表上进行修改创建元组的方法有三种:

    1、使用括弧“0”来创建,例如,a=(1,2,3);

    2、使用逗号来创建,例如,b=2,4;

    3、使用 tuple0函数把其他种类的序列转化为元组,例如,c= tuple(“Good!”)。

元组中各元素之间用逗号隔开。元组不支持修改或删除其所包含的元素。如果要修改,则可以使用list函数把它转化成列表,然后在列表上进行修改创建元组的方法有三种:

1、使用括弧“0”来创建,例如,a=(1,2,3);

2、使用逗号来创建,例如,b=2,4;

3、使用 tuple0函数把其他种类的序列转化为元组,例如,c= tuple(“Good!”)。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号