Python实例属性设置的方法

黄哥Python提醒, 设置实例属性除在__init__ 方法处之外,还可以在其它地方。

知乎上有一个提问者,就碰到这样的问题,下面的代码演示回答他的问题
python中普通方法中添加属性的时候,可以不在method.()括号中添加吗?

可以在类中的实例方法设置实例属性,凡是通过self点操作符为左值的时候,都是赋值,

如果该属性存在,赋新值(绑定到新的对象),如果属性不存在,创建新的属性并将对象的引用赋值给该属性。

请看下面的代码,但建议在__init__ 方法处设置属性,但写一些测试代码时,会在其它方法中设置新的属性。

# coding:utf-8
'''
黄哥Python培训 黄哥所写
Python 3

'''


class Foo:

    def set_name(self, name):
        '''黄哥Python培训 黄哥所写'''
        self.name = name

    def get_name(self):
        '''黄哥Python培训 黄哥所写'''
        print(self.__dict__['name'])
        print(hasattr(self, 'name'))
        return self.name


p = Foo()
p.set_name("Python")
print(p.get_name())
# 输出结果
# Python
# True
# Python

黄哥谈转行当程序员
黄哥谈转行当程序员之二
黄哥Python提醒:转行当程序员修炼之路

黄哥Python Python 参数默认参数之值只计算一次

有网友问

>>> def foo(bar=[]): 



... bar.append("baz") 



... return bar 



>>> foo()



["baz"]



>>> foo()



["baz", "baz"]



>>> foo()



["baz", "baz", "baz"]

为什么多次调用foo()bar的值不会重新赋值为[]呢?bar的作用域不是应该在foo函数之内吗?

文档中是这么说的。

Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:

重要警告:默认值只计算一次。当默认值是可变对象(如列表,字典或大多数类的实例)时,这会有所不同。例如,以下函数会累积在后续调用中传递给它的参数

例子一:

i = 5

def f(arg=i):
    print(arg)

i = 6
f()

输出值为5,不是6

例子二:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

输出值为

[1]

[1, 2]

[1, 2, 3]

这个原因是由于默认参数只计算一次,因为list 是可变数据类型,函数每次调用时,L 是同一个对象的引用。

加一个id(),可以判断每次函数的调用都是访问的同一个list 实例对象。

def f(a, L=[]):
L.append(a)
print(id(L))
return L

print(f(1))
print(f(2))
print(f(3))

怎么破解这个问题,这样去修改代码。

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

黄哥谈转行当程序员
黄哥谈转行当程序员之二

黄哥Python,从一个小题目看学习编程思路的重要性

黄哥Python:从一个小题目看学习编程思路的重要性

下面是网友的提问,假定输入的是正整数。
有网友提问“python输入一个数字 把这个数字各个位相加求和?”。

解决这个问题,当然可以用字符串或list遍历相加。如果换一种编程语言,没有Python这样的特性呢?

黄哥对初学者提示解决这样的问题,有常用的算法,用 % 10 和 // 10,请看下面的代码,

和循环和递归去实现。

# coding:utf-8
'''
黄哥Python培训 黄哥所写 咨询qq:1465376564
Python 3

'''


def input_interger_number():
    number = input('please input a integer number:\n')
    while True:
        if number.isdigit():
            number = int(number)
            break
        else:
            number = input('please input a integer number again:\n')
    return number


def total_of_number(n):
    '''假定n 是 大于等于0 的整数 黄哥Python培训 黄哥所写'''
    if n == 0:
        return 0
    sum = 0
    while n > 0:
        sum += n % 10
        n //= 10
    return sum


def total_of_number_recursion(n):
    '''假定n 是 大于等于0 的整数 黄哥Python培训 黄哥所写'''
    if n == 0:
        return 0
    return n % 10 + total_of_number_recursion(n // 10)


def main():
    '''黄哥Python培训 黄哥所写'''
    number = input_interger_number()
    print(total_of_number(number))
    print(total_of_number_recursion(number))


if __name__ == '__main__':
    main()

很多初学编程者,最喜欢用list 去硬拼凑写出代码,没有想用到更好的数据结构和算法。

如何训练自己的编程思路

你想转行当程序员吗

邀请100名全国各地想转程序员的朋友,参加黄哥Python“夏日登顶计划”。

凡是非叶公好龙,肯花时间,不怕苦的有志青年都可以参加。

何为“夏日登顶计划”,学习编程就像爬一座大山,过了一个山峰又一个山峰,到达小高峰。
在登山过程中,有黄哥在傍指点迷津、呐喊加油。还有qq学员群一起切磋交流。
培训形式:看50讲视频+作业训练+qq答疑1年。
费用:请看https://github.com/pythonpeixun/article/blob/master/index.md 咨询qq:1465376564
通过训练达到不光能看懂代码,而且能自己写代码。训练学员养成独立思考、独立解决问题的能力。
目标
第一目标是:通过学习python学会编程 。

第二目标:会写爬虫,网页采集。

第三目标:学会web开发。
夏日登顶计划从2017年7月开始,到2018年2月15(除夕)结束,过完春节,就可以去找工作了。

黄哥的介绍请看下面网页后面部分
如何训练自己的编程思路

为啥水平不高的Python 初级程序员,企业还愿意招聘。

千人学习Python

2017年黄哥发起千人学习Python计划-《黄哥Python答疑服务》

鉴于很多零基础初学者碰到很多问题,经常几个小时或几天都搞不定,
黄哥提供收费答疑群服务,希望创建一个1000人学习群。

加入群享受的权利:
  1、24小时快速响应python问题答疑。
  2、定期分享文章。
  3、对于自学有困难的朋友,可以补差价转黄哥Python培训

特别提示:不帮助写程序,但帮助提供思路,调试程序,写程序或项目需要另外收费。
收费:1095 元/年  支付方式:微信或支付宝支付。
咨询qq:1465376564(加qq时,请附上咨询黄哥Python答疑服务)

目前收费群有6位会员

有来自上海的高材生,目前赴美国留学中。
有来自北京的运维朋友。
有来自成都的在校大学生。
有来自广西的网络安全人士。
有来自武汉的淘宝店主。
有来自西北的工程师。

答疑的价值

几分钟帮会员解决几个小时搞不定的问题。

黄哥是《黄哥Python培训》授课老师。下面是黄哥近照。

面授到底值不值

参加编程培训(Python、Java)面授到底值不值?

首先表明观点:一切不以结婚为前提的谈恋爱是耍流氓,
一切不是以培养学员养成独立思考、独立解决问题的能力的培训是耍流氓。
参加面授值不值,每一个人的情况不一样。这个需要自己做出有利的选择。

下面从几个方面说明,供没有自学能力的朋友参考。

1、首先要算经济账

面授培训费1.8万起跳,一般是学习4个月,4个月生活费按照北京
计算一个月花3000,4 * 3000 是1.2万,有的朋友现在有稳定工作,如果辞职学习,假定你目前工资5000元,
4个月是 4* 5000 ,2万元。从经济上算账, 
支出,1.8 + 1.2 3万, 少收入2万, 
经济上受影响5万元。这个还没有计算找工作前的开销。

黄哥需要问你一句,经济账,你能算得过来吗?

2、培训机构良莠不齐。

牛逼程序员工资年薪几十万,有的上百万,随便搜索培训机构招聘讲师,
工资有的才1.2万元/月,不到2万/月,
这样的工资能招聘到高水平的程序员吗?

3、培训机构的推荐就业是最大的忽悠。

一直以来,“号称程序员”的不少,但企业很难招聘到合格的程序员。

只要真正的有技能,会解决问题,还怕找不到工作。

4、很多岁数大的想转行当程序员。分几种情况说明。

(1)目前在从事运维、测试、数据分析的IT人士,请思考一个问题,
以后还想从事IT行业 吗?如果想,需要学会编程,这个是没有商量的,  
必须学会编程,不然以后会被淘汰。
通过学习Python学会编程是最好的选择之一。

(2)目前从事其它行业的大龄青年,与IT行业不搭界的,
说一个实话,已过30岁的,27,28,29岁转程序员很难,有困难,
第一个困难,面临着找工作企业不需要大龄青年。
但是问题不是不能克服,只要有兴趣,是可以转行成功的。
但付出的努力需要比别人多。

5、培训之目的,黄哥认为是帮助学员养成独立思考、独立解决问题的能力。

(1)有能力自学的朋友建议自学,当你自学有困难,碰到一个小问题,
几个小时都搞不定,有一个程序员的朋友帮助你解决,
可能分分钟帮你解决了。
黄哥经常帮很多朋友分分钟解决了他几个小时解决不了的问题。

(2)黄哥Python 培训的视频,和网上只讲语法的视频不一样,
黄哥既讲语法,又重点训练 编程思路,还有作业训练,有(qq:1465376564)及时答疑。

总结:

人和人不一样,请根据上面的建议作出最有利于自己的选择吧。

点击黄哥python培训试看视频播放地址

216小时学会Python

实例对象加法和字符串表示

有人提问
黄哥修改的代码

Python 类有特殊的方法__add__, __str__ 等。

object.__add__(self, other)
object.__sub__(self, other)
object.__mul__(self, other)
object.__floordiv__(self, other)
object.__mod__(self, other)
object.__divmod__(self, other)
object.__pow__(self, other[, modulo])
object.__lshift__(self, other)
object.__rshift__(self, other)
object.__and__(self, other)
object.__xor__(self, other)
object.__or__(self, other)

上面的方法被调用时,实现了相应的二元算术运算符。(+, -, , //, %, divmod(), pow(), *, <<, >>, &, ^, |)
实例说明:
表达式 x + y ,如果x的类有一个__add__方法,相当于x.__add__(y) 被调用。

类定义了__str__ 方法,当调用str()内置函数或Python 2的print 语句时,

这个方法就会被调用。

# coding:utf-8


class Point(object):
    """黄哥修改"""

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):

        if isinstance(other, tuple):
            self.x += other[0]
            self.y += other[1]
            return self

        elif isinstance(other, Point):
            self.x += other.x
            self.y += other.y
            return self

    def __radd__(self, other):
        return self.__add__(other)

    def __str__(self):
        return "Point({0}, {1})".format(self.x, self.y)

    __repr__ = __str__

p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = Point(2, 2)
print p1 + p2 + p3
print sum([p1 + p2 + (3, 5)], p3)
print str(p3)

Python上海周末培训班

216小时学会Python

Python列表元素分组

知乎上有人问
Python中的列表按相同元素分割?
比如列表[0,0,0,1,1,2,3,3,3,2,3,3,0,0]分割成[0,0,0],[1,1],[2],[3,3,3],[2],[3,3],[0,0]

如何解决这样的问题呢?
1、首先说明,如果这样的题目都不能写出代码,原因在基本的循环判断没有搞清楚。
2、黄哥在如何训练自己的编程思路 文章所说的,做习题,要像开发项目的流程一样
(需求->需求分析->设计->编码->测试->交付等),
拿到一个习题,还没有进行分析,就匆匆忙忙敲代码,
这个学习方法,是不好的学习方法。

3、如果做这个习题,看黄哥的讲解,先要分析,分析看出是按照相邻元素是不是相同来分组。
设计解决方法,大问题化解为小问题,先化解为找出元素不相同的那个元素的索引,有这个索引后,再进行分组。

4、编码

代码一:

# coding:utf-8


def group_by_element(lst):
    '''by 黄哥  基本思路是先取得不同元素起始的索引值,
    再按照这个索引值取切片
    '''
    index = []
    result = []
    for i, _ in enumerate(lst):
        if i < len(lst) - 1 and lst[i + 1] != lst[i]:
            index.append(i + 1)

    result.append(lst[:index[0]])
    for i, item in enumerate(index):
        if i < len(index) - 1:
            result.append(lst[index[i]:index[i + 1]])
    result.append(lst[item:])
    return result

if __name__ == '__main__':
    lst = [0, 0, 0, 1, 1, 2, 3, 3, 3, 2, 3, 3, 0, 0]
    group = group_by_element(lst)
    print group

代码二:

# coding:utf-8


def group_by_element(lst):
    '''by 黄哥  基本思路是先取得不同元素起始的索引值,
    再按照这个索引值,用生成器分组。
    '''
    index = []
    for i, _ in enumerate(lst):
        if i < len(lst) - 1 and lst[i + 1] != lst[i]:
            index.append(i + 1)

    def take(lst, n):
        for i in range(n):
            yield next(lst)

    if not hasattr(lst, 'next'):
        lst = iter(lst)

    begin = 0
    for item in index:
        x = list(take(lst, item - begin ))
        begin = item
        yield x

    yield list(lst)

if __name__ == '__main__':
    lst = [0, 0, 0, 1, 1, 2, 3, 3, 3, 2, 3, 3, 0, 0]
    group = group_by_element(lst)
    print list(group)

思路三:
基本思路用一个二维list [[]], 遍历list,判断前后元素是不是相等,如果相等添加到result[-1],
如果不相等,需要添加一个空[]。

# coding:utf-8


def group_by_element(lst):
    '''by 黄哥  基本思路用一个二维list [[]], 遍历list
    判断前后元素是不是相等,如果相等添加到result[-1],如果
    不相等,需要添加一个空[]
    '''
    result = [[]]
    length = len(lst)
    for i in range(length):
        if i < length - 1:
            if lst[i] == lst[i + 1]:
                result[-1].append(lst[i])
            else:
                result[-1].append(lst[i])
                result.append([])

    result[-1].append(lst[i])
    return result

if __name__ == '__main__':
    lst = [0, 0, 0, 1, 1, 2, 3, 3, 3, 2, 3, 3, 0, 0]
    group = group_by_element(lst)
    print group

216小时学会Python

点击黄哥python培训试看视频播放地址

216小时学会Python

216小时是怎么来的,学习三个月,周一到周五学习2小时,周六、周日每天学习4小时。

学习途径:跟着黄哥的视频学习,写作业,答疑。

目标:三个月可以到达自己写代码解决问题的能力。

第一目标是:通过学习python学会编程 。

第二目标:会写爬虫,网页采集。

第三目标:学会web开发。

黄哥python远程视频培训

咨询qq:1465376564

如何训练自己的编程思路

部分免费Python免费视频

感恩!感谢黄哥Python培训学员的支持和肯定。